我有两个表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中的所有删除相比,这将更加方便和面向未来。
答案 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;