实体框架 - 外键组件不是类型

时间:2016-03-09 12:27:16

标签: c# .net entity-framework ef-code-first code-first

public virtual DbSet<DBVolumetricObject> Volumetrics { get; set; } //this make error

我有以下模型

public abstract class DBVolumetricObject
{
    public int Id { get; set; }
    public int Design_Id { get; set; }
}

public class Material : DBVolumetricObject
{
    public virtual MaterialDesign MaterialDesign { get; set; }
}

public class MaterialDesign : IDBDesign
{
    ...
    public virtual List<Material> Materials { get; set; }
}

配置:

public class MaterialConfiguration : EntityTypeConfiguration<Material>
{
    public MaterialConfiguration()
    {
        Map(m => m.MapInheritedProperties());

        HasRequired<MaterialDesign>(x => x.MaterialDesign)
            .WithMany(x => x.Materials)
            .HasForeignKey(x => x.Design_Id);
    }
}

当我尝试通过包管理器控制台中的update-database命令初始化数据库时,出现以下错误。

  

外键组件'Design_Id'不是声明的属性   输入'材料'。确认未明确排除   模型,它是一个有效的原始属性。

1 个答案:

答案 0 :(得分:4)

我做了一些测试以验证我的评论并且它有效。

您的问题是您在基类中定义了FK - Design_Id,并在派生类中定义了此Design的导航属性。这样就可以错误地映射FK Design_Id,并允许它用作多个表的FK。为了防止出现这类问题,Entity Framework告诉您:将您的FK属性和Navigation属性放在同一个类中。否则,它将无法工作。

所以解决方案就是让你的类结构如下:

public abstract class DBVolumetricObject
{
    public int Id { get; set; }
}

public class Material : DBVolumetricObject
{
    public int Design_Id { get; set; }
    public virtual MaterialDesign MaterialDesign{ get; set; }       
}

public class MaterialDesign : IDBDesign
{
   ...
   public virtual List<Material> Materials { get; set; }
}