我有以下非常复杂的表结构(名称已更改且某些字段已删除)。最初在添加或更新table1时,它将新项添加到table2中,因此我将table2中的关系从只有一个主键更改为组合键,以确保如果存在Table1Id
和Table2Id
的项目,它应该更新它,否则插入它。 Table2
有许多列CustomDataType
,这是指向已添加值的派生CustomType
表的链接。
我尝试了各种映射,但是我遇到了Table2Id
之类的错误,其中已经跟踪了值或者我现在收到的错误。这种关系非常复杂,我花了几个小时试图弄清楚如何最好地解决这个问题,但到目前为止似乎没有任何效果。
有人知道我在这里做错了什么以及如何做对吗?
这又是我试图解决的关系:
Table1
有许多Table2
个项目Table2
包含多个CustomDataType
项,并通过Table1
与Table1Id
相关联;它还使用Table1Id
和Table2Id
来标识唯一的行CustomDataType
有一个独特的Id
和三列:CustomType1
,CustomType2
和CustomType3
CustomType
是CustomType1
,CustomType2
和CustomType3
的父级,并且具有唯一的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
类中,我有以下映射创建组合键,因为只有Table1Id
与Table2Id
结合才能产生唯一结果:
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 行(多个)