从EF Core RC2升级到V1

时间:2016-07-04 13:25:14

标签: entity-framework-core

希望这只是一个简单的,但我刚刚升级到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,这一切都很有效!

2 个答案:

答案 0 :(得分:2)

由于异常声明导航属性只能是一个关系的一部分。在RC2中,EF会默默地用第二个替换第一个,但是在RTM中,它会提醒你注意这个事实。 您应该创建另一个属性,比如说ClientsAtHome用于另一个关系。

答案 1 :(得分:0)

https://stackoverflow.com/a/44574378/3855971

中以多对多关系引用第二个集合并非强制性