EF迁移中的自定义外键

时间:2016-02-07 02:03:02

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

有人请帮我解决此错误:

  

无法确定类型'DataLayer.Data.SETTINGGRP'和'DataLayer.Data.SETTING'之间关联的主要结束。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。

我的代码:

public class BaseEntity 
{
    [Key]
    public long objectId { get; set; }    
}

public partial class SETTINGGRP: BaseEntity
{  
    public string REMARKS { get; set; } 
    public virtual SETTING SETTING { get; set; }
}

public partial class SETTING : BaseEntity
{ 
    public Nullable<long> SETTINGGRP_objectId { get; set; } 
    public string NAME { get; set; } 
    [ForeignKey("SETTINGGRP_objectId")]
    public virtual SETTINGGRP SETTINGGRP { get; set; } 
}

我已经提到了这个网址:https://msdn.microsoft.com/en-us/data/jj591620#RequiredToRequired

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<WORKERINFO>().HasKey(d => new { d.objectId, d.EMP_objectId });
        modelBuilder.Entity<WORKERINFO>().HasRequired(t => t.EMP).WithOptional(t => t.WORKERINFO);
    }

我希望objectId是主键,SETTINGGRP_objectId应该是外键。

请建议我如何编写注释或流畅的api。

1 个答案:

答案 0 :(得分:0)

查看您的代码似乎SETTINGGRPSETTING是一对一的关系。如果是这种情况,您可能需要配置关系。要做同样的事情,请参阅https://msdn.microsoft.com/en-us/data/jj591620#RequiredToRequired

然而,直观地(从实体的名称)似乎关系应该是一对多,即一个SETTINGGRP有许多SETTING s(但是,我可能是错的),在这种情况下,我认为只有通过以下方式更改SETTING中的SETTINGGRP属性才能解决问题:

public virtual ICollection<SETTING> SETTINGS { get; set; }
  

我希望objectId是主键,SETTINGGRP_objectId应该是外键。

为此,请尝试使用Table-Per-Concrete Class (TPC) Inheritance,然后使用HasKey()HasForeignKey()指定主键和外键属性。