复合关键实体并且不想声明PK密钥

好吧,这应该很简单。 我有一堂课

public class ProductConfig
{
   public Category { get;set; }
   public Product { get;set; }
}

这两个导航属性也是表的主键。 声明PRoductId和CategoryIds是冗余的。 如何使用nav属性来配置主键?

编辑:愚蠢的我。 我在上面的问题中忘记了一件非常重要的事。 以上两点是要指出配置。 然后,我们有第三个fk将选定的配置用于产品和类别的组合。 所以上述实体必须是物化实体

public class ProductConfig
{
   public Category { get;set; }
   public Product { get;set; }
   public ProductCategoryType { get; set; }
}

声明ProductId和CategoryId是多余的。 如何使用nav属性来配置主键?

不久 - 你不能。 虽然EF6支持基于阴影属性的FK,但它不提供使用阴影属性名称配置PK(以及许多其他列相关设置)的方法 - [Key][Column]数据注释不能应用于导航属性和HasKey流畅API需要基本属性选择器表达式。 通常EF6不支持PK中的阴影属性。

EF Core中已删除所有这些限制。 但是在EF6中,无论是否冗余,您必须在实体中定义实际的原始属性并将它们映射到组合PK。


您只需通过导航属性在产品和类别实体之间建立关系。 EF将通过自己的多对多关系建立正确的表结构。 所以不需要自己的关系实体。 请查看:EF中的多对多关系

例如:

产品类别:

public class Product
{
    // other properties

    public virtual ICollection<Category> Categories { get; set; }
}

分类类别:

public class Category
{
    // other properties

    public virtual ICollection<Product> Products { get; set; }
}

还是我误解了你的问题?

编辑:如果你需要一个独立的实体,比如你的ProductConfig ,那么你应该尝试将它设置为一个唯一的索引约束:

modelBuilder
    .Entity<ProductConfig>()
    .HasIndex(pc => new {pc.Category, pc.Product})
        .IsUnique();

有关更多信息,请阅读以下内容:HasIndex - Fluent API

编辑2 (获得信息解决方案后,EF <6.2需要):

在你最后一个问题编辑完成后,需要另一种解决方案。 开始了...

你需要一个如下结构:

产品

public class Product
{
    // other properties

    public virtual ICollection<ProductConfig> ProductConfigs { get; set; }
}

类别

public class Category
{
    // other properties

    public virtual ICollection<ProductConfig> ProductConfigs { get; set; }
}

ProductConfig

public class ProductConfig
{
    // other properties

   public virtual Category { get; set; }

   public virtual Product { get; set; }

   public virtual ProductCategoryType { get; set; }
}

为了在EF <6.2中设置一个唯一的约束,你必须这样做:

modelBuilder.Entity<ProductConfig>()
        .Property(e => e.Category)
        .HasColumnAnnotation(
            IndexAnnotation.AnnotationName, 
            new IndexAnnotation(new IndexAttribute("YourIndex", 1) { IsUnique = true }));

modelBuilder.Entity<ProductConfig>()
        .Property(e => e.Product)
        .HasColumnAnnotation(
            IndexAnnotation.AnnotationName, 
            new IndexAnnotation(new IndexAttribute("YourIndex", 2) { IsUnique = true }));

modelBuilder.Entity<ProductConfig>()
        .Property(e => e.ProductCategoryType)
        .HasColumnAnnotation(
            IndexAnnotation.AnnotationName, 
            new IndexAnnotation(new IndexAttribute("YourIndex", 3) { IsUnique = true }));

在EF 6.2中:

modelBuilder.Entity<Person>()
    .HasIndex(p => new { p.Category, p.Product, p.ProductCategoryType })
    .IsUnique();

编辑3如果您的ProductConfig类中没有主键,或者您在我添加none的示例中使用了我的主键,因为我认为您已经拥有该类。 可以将多个属性设置为键。 这也将导致独特的组合。 您可以使用以下命令将其归档 - 而不是索引内容:

modelBuilder.Entity<ProductConfig>()
            .HasKey(pc => new { pc.Category, pc.Product, pc.ProductCategoryType });

有关更多信息,请查看MS文档。

你也可以添加一个Id作为主键,比索引是需要的。

链接地址: http://www.djcxy.com/p/33493.html

上一篇: Composite key entity and dont want to declare PK keys

下一篇: Entity Framework Core 1.1 and migration