C# 无法跟踪实体类型的实体框架实例

C# 无法跟踪实体类型的实体框架实例,c#,entity-framework-core,C#,Entity Framework Core,我拥有以下实体和实体框架核心1.1的上下文: public class Language { public String LanguageCode { get; set; } public virtual ICollection<LanguageI18N> LanguagesI18N { get; set; } = new List<LanguageI18N>(); } public class LanguageI18N { public String La

我拥有以下实体和实体框架核心1.1的上下文:

public class Language {
  public String LanguageCode { get; set; }
  public virtual ICollection<LanguageI18N> LanguagesI18N { get; set; } = new List<LanguageI18N>();
}

public class LanguageI18N {
  public String LanguageCode { get; set; }
  public String TranslationCode { get; set; }
  public String Name { get; set; }        
  public virtual Language Language { get; set; }
}

public class Context : DbContext {

  public DbSet<Language> Languages { get; set; }
  public DbSet<LanguageI18N> LanguagesI18N { get; set; }

  public Context(DbContextOptions options) : base(options) { }

  protected override void OnModelCreating(ModelBuilder builder) {

    base.OnModelCreating(builder);

    builder.Entity<Language>(b => {
      b.ToTable("Languages");
      b.HasKey(x => x.LanguageCode);
      b.Property(x => x.LanguageCode).IsRequired(true).HasMaxLength(2).ValueGeneratedNever();        
    });

    builder.Entity<LanguageI18N>(b => {
      b.ToTable("LanguagesI18N");
      b.HasKey(x => new { x.LanguageCode, x.TranslationCode });      
      b.Property(x => x.LanguageCode).HasMaxLength(2).IsRequired(true);
      b.Property(x => x.TranslationCode).HasMaxLength(2).IsRequired(true);
      b.HasOne(x => x.Language).WithMany(x => x.LanguagesI18N).HasForeignKey(x => x.LanguageCode).IsRequired(true).OnDelete(DeleteBehavior.Restrict);
      b.HasOne(x => x.Language).WithMany(x => x.LanguagesI18N).HasForeignKey(x => x.TranslationCode).IsRequired(true).OnDelete(DeleteBehavior.Restrict);      
    });      

  }

}
通过SQL Server数据库:

  builder.UseSqlServer(yourConnectionString);
我得到以下错误:

Unhandled Exception: Microsoft.EntityFrameworkCore.DbUpdateException: 
An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: 
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_LanguagesI18N_Languages_TranslationCode". 
The conflict occurred in database "TestDb", table "dbo.Languages", column 'LanguageCode'.
The statement has been terminated.
知道为什么吗?

这里

b.HasOne(x => x.Language).WithMany(x => x.LanguagesI18N).HasForeignKey(x => x.LanguageCode).IsRequired(true).OnDelete(DeleteBehavior.Restrict);
b.HasOne(x => x.Language).WithMany(x => x.LanguagesI18N).HasForeignKey(x => x.TranslationCode).IsRequired(true).OnDelete(DeleteBehavior.Restrict);      
您正试图将
语言
->
语言si18n
导航属性所表示的同一关联映射到两个不同的FK(
语言代码
翻译代码
),这是不可能的。第二行实际上覆盖了第一行,导致设置不正确

由于您有两个
一对多
关系,并且假设第一行包含第一行的正确设置,第二行可以通过将最后一行更改为:

b.HasOne<Language>().WithMany().HasForeignKey(x => x.TranslationCode).IsRequired(true).OnDelete(DeleteBehavior.Restrict);
b.HasOne().WithMany().HasForeignKey(x=>x.TranslationCode).IsRequired(true).OnDelete(DeleteBehavior.Restrict);

这种设置(两侧都没有导航属性)在EF6中是不可能的,但由于
HasOne
/
HasMany
方法的无参数重载,在EF Core中得到了完美的支持。只需将它们(以及一个/
多个
)与模型导航属性保持同步。

如何创建上下文对象?正在注射吗?您是如何将其添加到DI容器的?我只是在控制台应用程序中创建了带有连接字符串的上下文,它运行良好,因为我能够获得语言计数表某处?(PS命名你的上下文类上下文很混乱!)是的,我是。。。我使用上下文作为类型,因为目前我只是在测试它。我很难理解您的代码,因为您显然是在删减要在这里发布的位,但在这样做时,您提供了不可编译的代码。例如,
language.LanguagesI18N
将为您提供一个空引用异常。还有其他问题。您能提供一个建议吗?您的建议仅适用于InMemoryDatabase,而不适用于真正的SQL数据库。。。至少看起来是这样。我在问题中添加了一个更新,解释了我的尝试。实际上,新的异常表明上述方法有效-已创建正确的FK约束。现在,您的insert违反了规则,这意味着您指定了
TranslationCode
,而
Language
表中不存在该规则,是吗?@IvanStoev就在这里。语言代码
pt
未添加到语言表中,因此您无法添加专门针对所需关系引用它的子级。
Unhandled Exception: Microsoft.EntityFrameworkCore.DbUpdateException: 
An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: 
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_LanguagesI18N_Languages_TranslationCode". 
The conflict occurred in database "TestDb", table "dbo.Languages", column 'LanguageCode'.
The statement has been terminated.
b.HasOne(x => x.Language).WithMany(x => x.LanguagesI18N).HasForeignKey(x => x.LanguageCode).IsRequired(true).OnDelete(DeleteBehavior.Restrict);
b.HasOne(x => x.Language).WithMany(x => x.LanguagesI18N).HasForeignKey(x => x.TranslationCode).IsRequired(true).OnDelete(DeleteBehavior.Restrict);      
b.HasOne<Language>().WithMany().HasForeignKey(x => x.TranslationCode).IsRequired(true).OnDelete(DeleteBehavior.Restrict);