代码优先 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"

映射不正确吗?

代码优先 1.n 映射错误

您的外键映射不正确。将ProductGroupMap中的HasOptional代码替换为:

HasMany(_ => _.Products)
    .WithRequired()
    .HasForeignKey(_ => _.ProductGroupId);

这应该读作"ProductGroup 有一个产品集合,其中产品必须属于 ProductGroup,并且关系由外键属性 Product.ProductGroupId 控制"。

HasOptional/HasRequired旨在用于实体,具有必需/可选的引用导航属性(例如,Product.CountryOfOrigin),而不是集合导航属性。

换句话说,可以从两端配置实体之间的 1-* 关联:来自主体实体(在您的情况下ProductGroup)或来自从属实体 (Product )。

从主体实体端进行配置时,请使用 HasMany
使用 HasOptional/HasRequired ,当从依赖实体的一侧配置时:

  • HasOptional对委托人实体的引用是可选的;
  • HasRequired - 需要参考时。