复合关键实体并且不想声明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