Изменение имени по умолчанию для столбцов объединения, созданных EF Core.C#

Место общения программистов C#
Ответить
Anonymous
 Изменение имени по умолчанию для столбцов объединения, созданных EF Core.

Сообщение Anonymous »

Когда этот код выполняется (к вашему сведению, общий является VgnItmDbEntity):

Код: Выделить всё

var entity = await context.Set().Include(e => e.VgnItmImages)
.ThenInclude(vi => vi.Image)
.FirstOrDefaultAsync(v => v.Id == id);
Я получаю сообщение об ошибке:

Произошло исключение: CLR/Npgsql.PostgresException Выброшено исключение:
«Npgsql.PostgresException» в System.Private.CoreLib.dll: «42703:
столбец v0.VgnItmDbEntityId не существует
POSITION: 1163» в
Npgsql. Internal.NpgsqlConnector.d__233.MoveNext()

at
System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder

Код: Выделить всё

1.StateMachineBox
1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16
токен) в Npgsql.NpgsqlDataReader.d__52.MoveNext()

в Npgsql.NpgsqlDataReader.d__52. MoveNext() в
Npgsql.NpgsqlCommand.d__119.MoveNext() в
Npgsql.NpgsqlCommand.d__119.MoveNext() в
Npgsql.NpgsqlCommand.d__112.MoveNext() в
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.d__18.MoveNext()
at
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.d__18.MoveNext()
at
Microsoft.EntityFrameworkCore.Query. Internal.SingleQueryingEnumerable

Код: Выделить всё

1.AsyncEnumerator.d__21.MoveNext() at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlExecutionStrategy.d__7
2.MoveNext()
at
Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable

Код: Выделить всё

1.AsyncEnumerator.d__20.MoveNext() at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable
1.ConfiguredValueTaskAwaiter.GetResult()
at
Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.d__15

Код: Выделить всё

1.MoveNext() at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.d__15
1.MoveNext()
в Vepo.Data.VgnItmsRepository`5.d__9.MoveNext() в
/Users/benjaminfarquhar/dev/vepo_back_end/Vepo.Data/Repositories/VgnItms/VgnItmsRepository .cs:line
144

Это мои объекты и их конфигурация в OnModelCreating:

Код: Выделить всё

public class VgnItmDbEntity : CreatedBySomeoneDbEntity
{
[Required]
public string Name { get; set; }

[Required]
public string CompanyName { get; set; }

[MaxLength(3000)]
public string Description { get; set; }

[MaxLength(900)]
public string WebPage { get; set; }

public string Instagram { get; set; }
public string Facebook { get; set; }

[Required]
public int IsNotVeganCount { get; set; } = 0;

[Required]
public int IsVeganCount { get; set; } = 0;

[Required]
public int RatingsCount { get; set; } = 0;

public double? Rating { get; set; }

[Required]
public List Tags { get; set; }

public List SecondaryTags { get; set; }

public int? PricePoint { get; set; }

public ICollection VgnItmImages { get; set; }

public string Discriminator { get; set; }
}

public class VgnItmImageDbEntity : CreatedBySomeoneDbEntity
{
[ForeignKey(nameof(VgnItm))]
public int VgnItmId { get; set; }
public VgnItmDbEntity VgnItm { get; set; }

[ForeignKey(nameof(Image))]
public int ImageId { get; set; }
public ImageDbEntity Image { get; set; }
}

public class ImageDbEntity : CreatedBySomeoneDbEntity
{
[Required]
public Uri Url { get; set; }
public List Tags { get; set; }

public ICollection VgnItmImages { get; set; } = new List();
}

public abstract class CreatedBySomeoneDbEntity : DbEntity
{
public string CreatedById { get; set; }
public UserDbEntity CreatedBy { get; set; }
public string UpdatedById { get; set; }
public UserDbEntity UpdatedBy { get; set; }
}

public abstract class DbEntity
{
[Key]
public TId Id { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime UpdatedDate { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{

var uriConverter = new ValueConverter(
v => v == null ? null : v.ToString(),
v => v == null ? null : new Uri(v)
);

modelBuilder.Entity(image =>
{
image.Property(u => u.CreatedDate)
.HasDefaultValueSql("CURRENT_TIMESTAMP");
image.Property(u => u.UpdatedDate)
.HasDefaultValueSql("CURRENT_TIMESTAMP");

image.Property(i => i.Url)
.HasConversion(uriConverter);
});

// Vegan Item Images

modelBuilder.Entity(viImage =>
{
viImage.HasKey(e => new { e.VgnItmId, e.ImageId });

viImage.HasOne(e => e.VgnItm)
.WithMany(v => v.VgnItmImages)
.HasForeignKey(e => e.VgnItmId);

viImage.HasOne(e => e.Image)
.WithMany(i => i.VgnItmImages)
.HasForeignKey(e => e.ImageId);

viImage.HasIndex(g => new { g.VgnItmId, g.ImageId }).IsUnique();
viImage.Property(e => e.Id).IsRequired().ValueGeneratedOnAdd();
viImage.Property(u => u.CreatedDate)
.HasDefaultValueSql("CURRENT_TIMESTAMP");
viImage.Property(u =>  u.UpdatedDate)
.HasDefaultValueSql("CURRENT_TIMESTAMP");
viImage.HasOne(q => q.UpdatedBy)
.WithMany()
.HasForeignKey(k => k.UpdatedById);
viImage.HasOne(q => q.CreatedBy)
.WithMany()
.HasForeignKey(k => k.CreatedById);
});

modelBuilder.Entity(vgnItm =>
{
vgnItm.HasIndex("CompanyName", "Name", "Discriminator").IsUnique();
vgnItm.Property(e => e.Id).IsRequired().ValueGeneratedOnAdd();
vgnItm.HasDiscriminator("Discriminator")
.HasValue("RecipeItm")
.HasValue("EventItm")
.HasValue("GroceryItm")
.HasValue("MenuItm")
.HasValue("RestaurantItm")
.HasValue("GroceryStoreItm")
.HasValue("FashionItm");
vgnItm.Property(u => u.CreatedDate)
.HasDefaultValueSql("CURRENT_TIMESTAMP");
vgnItm.Property(u => u.UpdatedDate)
.HasDefaultValueSql("CURRENT_TIMESTAMP");
vgnItm.HasKey(e => e.Id);
vgnItm.HasOne(q => q.UpdatedBy)
.WithMany()
.HasForeignKey(k => k.UpdatedById);
vgnItm.HasOne(q => q.CreatedBy)
.WithMany()
.HasForeignKey(k => k.CreatedById);
vgnItm.HasMany(e => e.VgnItmImages)
.WithOne()
.OnDelete(DeleteBehavior.Cascade);
});

modelBuilder.Entity(recipeItm =>
{
recipeItm.Property(e => e.Ingredients).HasColumnType("jsonb");
recipeItm.Property(e => e.Method).HasMaxLength(100);
recipeItm.Property(e => e.Tips).HasMaxLength(20);
recipeItm.Property(e => e.Ingredients).HasMaxLength(100);
});

modelBuilder.Entity(singleLocationVgnItm =>
{
singleLocationVgnItm.HasIndex("CompanyName", "Name", "Discriminator", "LocationId").IsUnique();
singleLocationVgnItm
.HasOne(s => s.Location) // Each SingleLocationVgnItm has one Location.
.WithMany() // A Location can be associated with many SingleLocationVgnItm.
.HasForeignKey(s => s.LocationId); // Foreign key in SingleLocationVgnItm pointing to Location.
});
Имя столбца на самом деле VgnItmId, а не VgnItmDbEntityId. Я не хочу, чтобы какой-либо из моих автоматически созданных столбцов EF Core содержал DbEntity в имени. Мне пришлось выполнить миграцию вручную, чтобы удалить столбец VgnItmDbEntityId, но EF Core по-прежнему считает, что он существует при выполнении запросов времени выполнения в коде.
Как сообщить об этом EF Core? что имя столбца — не VgnItmDbEntityId, а VgnItmId?
Я использую EF Core 8.0.4. Я проверяю, является ли это ошибкой.
У этого парня была похожая проблема, но я уже использую его решение HasForeignKey в onModelCreating.

Подробнее здесь: https://stackoverflow.com/questions/786 ... in-columns
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»