实体框架核心 - 数据库操作预计会影响1行,但实际上影响了0行

时间:2018-06-07 16:55:22

标签: c# sql-server entity-framework .net-core entity-framework-core

我有以下非常复杂的表结构(名称已更改且某些字段已删除)。最初在添加或更新table1时,它将新项添加到table2中,因此我将table2中的关系从只有一个主键更改为组合键,以确保如果存在Table1IdTable2Id的项目,它应该更新它,否则插入它。 Table2有许多列CustomDataType,这是指向已添加值的派生CustomType表的链接。

我尝试了各种映射,但是我遇到了Table2Id之类的错误,其中已经跟踪了值或者我现在收到的错误。这种关系非常复杂,我花了几个小时试图弄清楚如何最好地解决这个问题,但到目前为止似乎没有任何效果。

有人知道我在这里做错了什么以及如何做对吗?

这又是我试图解决的关系:

  • Table1有许多Table2个项目
  • Table2包含多个CustomDataType项,并通过Table1Table1Id相关联;它还使用Table1IdTable2Id来标识唯一的行
  • CustomDataType有一个独特的Id和三列:CustomType1CustomType2CustomType3
  • CustomTypeCustomType1CustomType2CustomType3的父级,并且具有唯一的Id和一些值列

代码:

    public class table1 : ClientChangeTracker
    {
      [Key]
      public string Table1Id{ get; set; }
      public IEnumerable<table2> Table2List { get; set;}
      //various other fields
    }

    public class table2 : ClientChangeTracker
    {
      public string Table1Id { get; set;}
      public string Table2Id { get; set;}
      public CustomDataType item1 { get; set; }
      public CustomDataType item2 { get; set; }
      //many other CustomDataType fields (about 20)
    }

    public class CustomDataType : ClientChangeTracker
    {
      [Key]
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public long Id { get; set; }
      public IEnumerable<CustomType1> CustomType1 {get; set; }
      public IEnumerable<CustomType2> CustomType2 { get; set; }
      public IEnumerable<CustomType3> CustomType3 { get; set; }
    }

    public class CustomType1 : CustomType
    {
        //left empty to force creating different table for CustomType
    }

    public class CustomType2 : CustomType
    {
         //left empty to force creating different table for CustomType
    }

    public class CustomType3 : CustomType
    {
         //left empty to force creating different table for CustomType
    }

    public class CustomType
    {
      [Key]
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public long Id { get; set; }
      public double Value1 { get; set; }
      public double Value2 { get; set; }
    }

Context类中,我有以下映射创建组合键,因为只有Table1IdTable2Id结合才能产生唯一结果:

modelBuilder.Entity<table2>()
  .HasKey(x => new {x.Table1Id, x.Table2Id}

使用以下代码将数据保存到数据库中:

 public Entities.Table1 Save(Entities.Table1 table1)
 {
     _context.ChangeTracker.TrackGraph(table1, e => EntityHelper.ApplyStateUsingIsKeySet(e.Entry));

     if (_context.table1s.Any(x => x.Table1Id == table1.Table1Id))
     {
         LastSaveMode = SaveMode.Update;
         var newTable1 = _context.table1s.Update(table1).Entity;
         NumberOfObjectsWrittenToUnderlyingDatabase = _context.SaveChanges();
         return newTable1;
     }
     else
     {
         LastSaveMode = SaveMode.Add;
         var updatedTable1 = _context.table1s.Add(table1).Entity;
         NumberOfObjectsWrittenToUnderlyingDatabase = _context.SaveChanges();
         return updatedTable1;
     }                                          
 }

ApplyStateUsingIsKeySet代码:

public class EntityHelper
{
    internal static void ApplyStateUsingIsKeySet(EntityEntry entry)
    {
        if (entry.IsKeySet)
        {
            entry.State = ((ClientChangeTracker)entry.Entity).IsDirty ? EntityState.Modified : EntityState.Unchanged;
        }
        else
        {
            entry.State = EntityState.Added;
        }
    }
}

表在数据库中创建正常但是,在运行应用程序时,它会导致错误:

  

数据库操作预计会影响1行但实际上会影响0   行(多个)

0 个答案:

没有答案