实体框架代码优先:没有收集的外键

时间:2014-06-12 15:59:02

标签: entity-framework ef-code-first foreign-key-relationship

我开始使用EF6.1 CodeFirst和现有的batabase。我有以下表格:

Company
  ID integer
  Code varchar
  Currency_ID integer

Currency
  ID integer
  Company_ID integer
  Code varchar

背后的概念是,每个表都包含对Company_ID的引用。 我创建了以下类:

class Company
{
  public int ID { get; set; }
  public string Code { get; set; }
  [ForeignKey("Currency")
  public int? Currency_ID { get; set; }

  public virtual Currency Currency { get; set; }
}

class Currency
{
  public int ID { get; set; }
  public string Code { get; set; }
  [ForeignKey("Company")
  public int? Company_ID { get; set; }

  public virtual Company Company { get; set; }
}

当我使用此模型时,我收到错误

  

Company_Currency_Target :: Multiplicity在Role中无效   ' Company_Currency_Target'在关系' Company_Currency'。因为   Dependent Role属性不是关键属性,鞋面   依赖角色的多样性的界限必须是' *'。

除了添加ICollection< Currency>之外还有其他解决方案吗? CurrencyList到公司类?

---更新----

这里有一些示例数据:

公司ID:1代码:XXX Curreny_ID:100
公司ID:2代码:YYY Curreny_ID:102
货币ID:100代码:EUR Company_ID:1
货币ID:101代码:DOL Company_ID:1
货币ID:102代码:EUR Company_ID:2

---更新2 ----

我使用流畅的api找到了一个可能的解决方案

modelBuilder.Entity<Company>().HasOptional(q => q.Currency).WithMany().HasForeignKey(q => q.Currency_Id);
modelBuilder.Entity<Currency>().HasRequired(q => q.Company).WithMany().HasForeignKey(q => q.Company_Id);

有没有办法使用attirbutes做同样的事情?

1 个答案:

答案 0 :(得分:0)

您可以使用流畅的api进行设置。首先,您需要从实体类中删除Currency_ID和Company_ID属性。在您的DbContext类中重写OnModelCreating方法并放置代码:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Company>()
            .HasOptional(f => f.Currency)
            .WithOptionalDependent()
            .Map(c => c.MapKey("Currency_ID"));

        modelBuilder.Entity<Currency>()
            .HasOptional(f => f.Company)
            .WithOptionalDependent()
            .Map(c => c.MapKey("Company_ID"));

        base.OnModelCreating(modelBuilder);
    }

但是考虑到这不会产生1个关系,但是2.因此,如果公司提到货币,那么货币可能会引用其他公司。如果你想只有一个关系,那么你应该摆脱一个外键列(在公司或货币中)并配置它:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Company>()
            .HasOptional(f => f.Currency)
            .WithOptionalDependent(f => f.Company)
            .Map(c => c.MapKey("Currency_ID"));

        base.OnModelCreating(modelBuilder);
    }