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 4

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 вместо аннотации данных, ключевая часть не генерируется вообще. Почему?