Entity Framework: вставка нового объекта, связанного с другим объектом - PullRequest
0 голосов
/ 04 декабря 2009

У меня есть две таблицы FilesystemEntries и CacheEntries, где существует ассоциация 0..1 CacheEntry для FilesystemEntry (то есть для FilesystemEntry может иметь значение CacheEntry, но не наоборот). Первоначально CacheEntry для всех FilesystemEntries имеет значение 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 ]

2 голосов
/ 04 декабря 2009

Не уверен, что это проблема.

Но я бы попробовал сделать это:

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();

Первая избыточная операция может быть причиной проблемы.

Что касается каскадного удаления, взгляните на этот Совет для объяснения того, как Каскадное удаление действительно работает в EF.

Алекс

0 голосов
/ 04 декабря 2009

Я могу ошибаться, но если я не неправильно понимаю ваши отношения сущностей, вы можете попробовать это без

cacheEntry.FilesystemEntry = filesystemEntry;

линия. Это должно подразумеваться тем фактом, что вы установили

filesystemEntry.CacheEntry = cacheEntry;

Также мне повезло, используя следующий тип назначения при работе со свойствами навигации:

cacheEntry.FilesystemEntryReference.Value = filesystemEntry;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...