我开始使用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做同样的事情?
答案 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);
}