希望这只是一个简单的,但我刚刚升级到EF核心的发布版本,并且无法再对数据库运行任何代码。
我有2个表,一个客户端表和一个语言表。客户端有两个对语言表的引用,一个用于语言,另一个用于语言。 所以语言已经
public ICollection<Client> Clients { get; set; }
客户已
public Language Language { get; set; }
private int? _languageId;
public int? LanguageId
{
get
{
if (_languageId != 0)
return _languageId;
if (Language != null)
return Language.LanguageId;
return null;
}
set { _languageId = value; }
}
public Language LanguageAtHome { get; set; }
private int? _languageAtHomeId;
public int? LanguageAtHomeId
{
get
{
if (_languageAtHomeId != 0)
return _languageAtHomeId;
if (LanguageAtHome != null)
return LanguageAtHome.LanguageId;
return null;
}
set { _languageAtHomeId = value; }
}
在我的OnModelCreating中我有以下两行
modelBuilder.Entity<Client>().HasOne(m => m.LanguageAtHome).WithMany(m => m.Clients).HasForeignKey(p => p.LanguageAtHomeId).HasConstraintName("ForeignKey_Client_LanguageAtHome");
modelBuilder.Entity<Client>().HasOne(m => m.Language).WithMany(m => m.Clients).HasForeignKey(p => p.LanguageId).HasConstraintName("ForeignKey_Client_Language");
我已经查看了RC2到V1的升级文档,但它没有说明对此的更改。 https://docs.efproject.net/en/latest/miscellaneous/rc2-rtm-upgrade.html
例外是:
System.InvalidOperationException: Cannot create a relationship between 'Language.Clients' and 'Client.Language', because there already is a relationship between 'Language.Clients' and 'Client.LanguageAtHome'. Navigation properties can only participate in a single relationship.
我尝试将其反转为
modelBuilder.Entity<Language>().HasMany(l => l.Clients).WithOne(c => c.LanguageAtHome).HasForeignKey(k => k.LanguageAtHomeId).HasConstraintName("ForeignKey_Client_LanguageAtHome");
modelBuilder.Entity<Language>().HasMany(l => l.Clients).WithOne(c => c.Language).HasForeignKey(k => k.LanguageId).HasConstraintName("ForeignKey_Client_Language");
但我得到完全相同的错误。
查看git hub上的EF源我将错误追溯到此变更集https://github.com/aspnet/EntityFramework/commit/5765564bc4dc55f9acb1716a1f5b40a8f8b0b399中的内部关系构建器行2145。
我的预感是RC2和V1之间发生了这种变化。
我的问题是我做错了什么或这是一个已经引入的错误?
更新 - 解答感谢Andriy
我将我的语言类改为拥有2个客户端集合,如此
public ICollection<Client> LanguageAtHomeClients { get; set; }
public ICollection<Client> LanguageClients { get; set; }
并将OnModelCreating中的关系修改为
modelBuilder.Entity<Client>().HasOne(m => m.LanguageAtHome).WithMany(m => m.LanguageAtHomeClients).HasForeignKey(p => p.LanguageAtHomeId).HasConstraintName("ForeignKey_Client_LanguageAtHome");
modelBuilder.Entity<Client>().HasOne(m => m.Language).WithMany(m => m.LanguageClients).HasForeignKey(p => p.LanguageId).HasConstraintName("ForeignKey_Client_Language");
我刚刚升级到EF Core V1,这一切都很有效!
答案 0 :(得分:2)
由于异常声明导航属性只能是一个关系的一部分。在RC2中,EF会默默地用第二个替换第一个,但是在RTM中,它会提醒你注意这个事实。 您应该创建另一个属性,比如说ClientsAtHome用于另一个关系。
答案 1 :(得分:0)