我有这两个型号:
public class Product
{
public int Id {get; set;}
public int ProductGroupId {get; set;}
}
public class ProductGroup
{
public int Id {get; set;}
public virtual ICollection<Product> Products {get; set;}
}
和映射:
public class ProductMap
{
this.ToTable("products");
this.HasKey(t => t.Id).Property(t => t.Id).HasColumnName("id")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Property(t => t.Key).HasColumnName("id_product_group")
.IsRequired();
}
public class ProductGroupMap
{
{
this.ToTable("product_groups");
this.HasKey(t => t.Id).Property(t => t.Id).HasColumnName("id")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.HasOptional(t => t.Products)
.WithMany()
.WillCascadeOnDelete();
}
代码编译但是当我启动应用程序时,我得到以下异常:
无效的列&#34; Products_Id&#34;
映射不正确吗?
答案 0 :(得分:0)
您的外键映射不正确。
将HasOptional
中的ProductGroupMap
代码替换为:
HasMany(_ => _.Products)
.WithRequired()
.HasForeignKey(_ => _.ProductGroupId);
这应该被理解为“ProductGroup有一个产品集合,其中产品必须属于ProductGroup,并且该关系由外键属性Product.ProductGroupId控制”。
HasOptional
/ HasRequired
旨在用于具有必需/可选引用导航属性(例如Product.CountryOfOrigin
)的实体,而不是集合导航属性。
换句话说,可以从双方配置实体之间的1- *关联:来自主体实体(在您的情况下为ProductGroup
),或来自从属实体(Product
)。
从主体实体侧配置时使用HasMany
从依赖实体一侧进行配置时,请使用HasOptional
/ HasRequired
:
HasOptional
; HasRequired
- 需要参考时。