代码优先1..n映射错误

时间:2014-11-27 09:11:12

标签: c# entity-framework ef-code-first entity-framework-6

我有这两个型号:

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;

映射不正确吗?

1 个答案:

答案 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 - 需要参考时。