代码优先 1.n 映射错误
本文关键字:映射 错误 代码 | 更新日期: 2023-09-27 18:32:16
我有这两个模型:
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();
}
代码可以编译,但是当我启动应用程序时,我收到以下异常:
无效列"Products_Id"
映射不正确吗?
您的外键映射不正确。将ProductGroupMap
中的HasOptional
代码替换为:
HasMany(_ => _.Products)
.WithRequired()
.HasForeignKey(_ => _.ProductGroupId);
这应该读作"ProductGroup 有一个产品集合,其中产品必须属于 ProductGroup,并且关系由外键属性 Product.ProductGroupId 控制"。
HasOptional
/HasRequired
旨在用于实体,具有必需/可选的引用导航属性(例如,Product.CountryOfOrigin
),而不是集合导航属性。
换句话说,可以从两端配置实体之间的 1-* 关联:来自主体实体(在您的情况下ProductGroup
)或来自从属实体 (Product
)。
从主体实体端进行配置时,请使用 HasMany
。
使用 HasOptional
/HasRequired
,当从依赖实体的一侧配置时:
-
HasOptional
对委托人实体的引用是可选的; -
HasRequired
- 需要参考时。