EF Composite key fluent API
Я пытаюсь сопоставить составной ключ для сущности.
public class Customer
{
public int CustomerId { get; set; }
public virtual List<CustomerImage> CustomerImages { get; set; }
}
И его Карта:
public class CustomerMap : EntityTypeConfiguration<Customer>
{
public CustomerMap()
{
HasKey(t => t.CustomerId);
ToTable(DbConstants.k_CustomersImageTable);
}
}
Изображение:
public class Image
{
public int ImageId { get; set; }
}
И его карта:
public class ImageMap : EntityTypeConfiguration<Image>
{
public ImageMap()
{
HasKey(t => t.ImageId);
ToTable(DbConstants.k_ImagesTable);
}
}
И свойство навигации:
public class CustomerImage
{
public int CustomerId { get; set; }
public int ImageId { get; set; }
public virtual Customer CustomerRelated { get; set; }
public virtual Image ImageRelated { get; set; }
}
И его карта:
public class CustomerImageMap : EntityTypeConfiguration<CustomerImage>
{
public CustomerImageMap()
{
HasKey(t => new { t.CustomerId, t.ImageId });
Property(t => t.CustomerId).IsRequired().HasColumnOrder(0);
Property(t => t.ImageId).IsRequired().HasColumnOrder(1);
HasRequired(t => t.ImageRelated).WithMany().HasForeignKey(x => x.ImageId);
HasRequired(p => p.CustomerRelated)
.WithMany(p => p.CustomerImages)
.WillCascadeOnDelete(false);
ToTable(DbConstants.k_CustomersImageTable);
}
}
Но я продолжаю получать следующее исключение:
При создании модели были обнаружены одна или несколько ошибок валидации:
Система.Данные.Сущность.Электроэрозионная обработка.EdmEntityType:: EntityType 'CustomerImage' не имеет определенного ключа. Определите ключ для этого тип EntityType product.
Система.Данные.Сущность.Электроэрозионная обработка.EdmEntitySet: EntityType: EntitySet 'CustomerImages' основан на типе 'CustomerImage', который не имеет определенных ключей.
Однако , если я определяю составной ключ с аннотациями данных, что не очень приятно, он отлично работает:
public class CustomerImage
{
[Key, Column(Order = 0)]
public int CustomerId { get; set; }
[Key, Column(Order = 1)]
public int ImageId { get; set; }
}
И его карта:
public class CustomerImageMap : EntityTypeConfiguration<CustomerImage>
{
public CustomerImageMap()
{
ToTable(DbConstants.k_CustomersImageTable);
}
}
Я перепробовал множество вариантов определений, но ни одно из них не работает.
Есть идеи? Это эф баг?1 ответ:
Как оказалось, я просто забыл положить карту на DbContext:
modelBuilder.Configurations.Add(new CustomerImageMap());
Тем не менее, составной идентификатор все еще не заполняется на $metadata таким образом. И поэтому, используя аннотацию данных, это метаданные, которые генерируются:
<EntityType Name="CustomerImage"> <Key> <PropertyRef Name="CustomerId"/> <PropertyRef Name="ImageId"/> </Key> <Property Name="CustomerId" Type="Edm.Int32" Nullable="false"/> <Property Name="ImageId" Type="Edm.Int32" Nullable="false"/> <Property Name="LastUpdated" Type="Edm.DateTime"/> <NavigationProperty Name="Customer" Relationship="EasyBizy.Entities.Models.EasyBizy_Entities_Models_CustomerImage_Customer_EasyBizy_Entities_Models_Customer_CustomerPartner" ToRole="Customer" FromRole="CustomerPartner"/> <NavigationProperty Name="Image" Relationship="EasyBizy.Entities.Models.EasyBizy_Entities_Models_CustomerImage_Image_EasyBizy_Entities_Models_Image_ImagePartner" ToRole="Image" FromRole="ImagePartner"/> </EntityType>
Однако, если использовать fluent API вместо аннотации данных, ключевая часть не генерируется вообще. Почему?