由于某种原因,我无法使用Entity Framework更新子集合。我有在.edmx中生成的以下架构。
MainRecord RecordType RecordTypeMap
MainRecordID RecordTypeID RecordTypeMap
[Other fields] RecordTypeName RecordTypeID
RecordType表包含一小部分RecordTypes,其想法是使用映射表。 一个MainRecord可以具有多个RecordType,因此RecordTypeMap表可能如下所示:
MainRecordID RecordTypeID
1002 1
1002 2
1003 1
1004 2
1004 3
1004 4
EF生成此数据的方式是,它知道这是一个映射表,并且我的MainRecord对象具有RecordTypes的集合。问题是当我尝试添加,编辑或删除这些记录时,错误的信息似乎进入了数据库。如果我要通过以下呼叫添加新的MainRecord:
context.MainRecords.Add(record);
此特定MainRecord的RecordTypes最终在带有新RecordTypeID的RecordType表中,而不是在具有现有RecordTypeID的RecordTypeMap表中。我尝试了多种排列来编辑和删除这些RecordType与MainRecord的关联。虽然我可以破解一个解决方案,但是是否没有一种EF友好的方法来执行上述映射功能?我正在使用EF6。
编辑:如何使以下代码编辑与MainRecord相关的RecordType记录?代码的“添加”部分工作正常,尽管为什么在将RecordType的实体状态视为“已修改”时它仍然可以工作...
这是保存记录的代码。如果存在明显的语法问题,则是转录错误。
public bool SaveRecord(MainRecord record)
{
using (var context = new DBEntities())
{
var existingRecord = context.MainRecords.SingleOrDefault(x => x.MainRecordID == record.MainRecordID);
if (existingContact != null)
{
context.Entry(existingRecord).CurrentValues.SetValues(record);
}
else
{
// Add new record.
context.MainRecords.Add(record);
// The below properly adds entries with the existing keys into the Map table.
// Not sure why this does that, it doesn't look like it would on the surface.
foreach (var type in contact.tblContactTypes)
{
context.Entry(type).State = EntityState.Modified;
}
}
}
context.SaveChanges();
return true;
}