Entity framework 实体框架CodeFirst:不带集合的外键
我从EF6.1 CodeFirst和现有的batabase开始。我有以下表格:Entity framework 实体框架CodeFirst:不带集合的外键,entity-framework,ef-code-first,foreign-key-relationship,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 背后的概念是,每个表都包含对公司ID的引用。 我创建了以下类: class Company { public int ID { get; set; } public strin
Company
ID integer
Code varchar
Currency_ID integer
Currency
ID integer
Company_ID integer
Code varchar
背后的概念是,每个表都包含对公司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类添加ICollection CurrencyList之外,还有其他解决方案吗
--更新--
以下是一些示例数据:
公司编号:1代码:XXX当前编号:100
公司编号:2代码:YYY货币编号:102
货币识别号:100代码:欧元公司识别号:1
货币ID:101代码:DOL公司\u ID:1
货币识别号:102代码:欧元公司识别号:2
--更新2--
我使用fluent 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实现同样的功能?您可以使用fluent api进行设置。首先,需要从实体类中删除Currency\u ID和Company\u 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个关系,则应去掉“公司”或“货币”中的一个外键列,并按如下方式进行配置:
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);
}
你的模型错了。只有一家公司可以使用一种货币吗?如果是这样,每家公司如何开展业务?我认为,您还将ForeignKey属性放在了错误的属性上。这应该是关联,而不是外键。PS当一家公司能够像跨国公司一样使用多种货币时会发生什么?模型应该是可以的。正如我所说,每个表都有一个到company表的链接。这样,数据库中的每个记录都与公司关联。每个公司都创建自己的货币记录,并将一种货币与公司关联。这是该公司使用的主要货币。根据我的发现,您可以在ID属性上放置ForeignKey:多个公司可以使用相同的货币吗?一家公司能否拥有多种货币,其中一种货币是主要货币?