实体框架:插入与另一个实体关联的新实体

时间:2009-12-04 01:49:03

标签: c# .net entity-framework sqlite linq-to-entities

我有两个表FilesystemEntries和CacheEntries,其中每个FilesystemEntry存在0..1 CacheEntry的关联(即FilesystemEntry可以具有空CacheEntry,但反之亦然)。最初,所有FilesystemEntries的CacheEntry都为null。我无法更改此内容(添加新的CacheEntry)。代码(截断的)如下所示:

FilesystemEntry filesystemEntry; // Already exists in database
CacheEntry cacheEntry;           // A new one is created
// ...
filesystemEntry.CacheEntry = cacheEntry;       // Was null before (verified in debugger)
cacheEntry.FilesystemEntry = filesystemEntry;
_db.AddToCacheEntries(cacheEntry);

但是,我收到了以下错误:

System.Data.UpdateException: A relationship is being added or deleted from an 
AssociationSet 'FK_CacheEntries_0'. With cardinality constraints, a corresponding 
'CacheEntries' must also be added or deleted.

任何实体框架向导都知道发生了什么?

同样,有没有办法让数据库处理“ON DELETE CASCADE”(我正在使用sqlite,所以它将通过触发器)?与指定DAL中的所有删除相比,这将更加方便和面向未来。

2 个答案:

答案 0 :(得分:2)

不确定这是不是问题。

但我会尝试这样做:

FilesystemEntry filesystemEntry; // Already exists in database
CacheEntry cacheEntry;   // A new one is created        
filesystemEntry.CacheEntry = cacheEntry; 
// redundant cacheEntry.FilesystemEntry = filesystemEntry;
// redundant _db.AddToCacheEntries(cacheEntry);
_db.SaveChanges();

第一个冗余操作可能导致问题。

至于级联删除,请查看此Tip,了解Cascade删除真正在EF中的工作方式。

Alex

答案 1 :(得分:0)

我可能错了,但除非我误解你的实体关系,否则你可能会在没有

的情况下尝试
cacheEntry.FilesystemEntry = filesystemEntry;

线。这应该隐含在您设置

的事实中
filesystemEntry.CacheEntry = cacheEntry;

在处理导航属性时,我也很幸运使用以下类型的赋值:

cacheEntry.FilesystemEntryReference.Value = filesystemEntry;