EF友好的方式来更新关系为映射表的子集合

时间:2019-01-14 19:19:41

标签: c# entity-framework-6

由于某种原因,我无法使用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;
        }

0 个答案:

没有答案