Построение EntityObject из EntityKey без вызова базы данных в Entity Framework - PullRequest
3 голосов
/ 15 июня 2009

Предполагая, что у меня есть строка в базе данных с определенным идентификатором, который я знаю (в моем примере ниже - символ с Id = 5), могу ли я создать объект EntityObject, который можно присоединить к другому объекту без необходимости его загрузки из базы данных (такой же сценарий применим и к «DeleteObject», если вы об этом думаете ...)?

Я пробовал следующее:

UserSpread spread = UserSpread.CreateUserSpread(5, 500000, 1.1m, 1.5m);

EntityKey symbolKey = new EntityKey("Entities.SymbolSet", "Id", 5);

Symbol symbol = new Symbol();
symbol.EntityKey = symbolKey;

// dealingEntities.Attach(symbol);

spread.Symbol = symbol;
Entities.AddToSpreadSet(spread);

Я получаю следующее исключение при использовании метода AddToSpreadSet ():

"Невозможно добавить объект в ObjectStateManager, поскольку у него уже есть EntityKey. Используйте ObjectContext.Attach, чтобы прикрепить объект с существующим ключом."

Если я попытаюсь прикрепить символ перед тем, как присвоить его спреду (закомментированная строка), я получу следующее о методе «SaveChanges ()»:

"Объект не может быть присоединен, поскольку значение свойства, являющегося частью EntityKey, не соответствует соответствующему значению в EntityKey."

Есть идеи?
Спасибо,
Nir

Ответы [ 2 ]

3 голосов
/ 17 июня 2009

Общий подход, который я использую, состоит в том, чтобы просто создать объект-заглушку (путем установки только PK) и присоединить его к контексту.

Итак, вот пример:

Category existing = new Category {ID = 7};
ctx.AttachTo("Categories", existing); // Notice no use of EntityKey anywhere


// build a new product
...
product.Category = existing;
ctx.AddToProducts(product);
ctx.SaveChanges();

Это хорошо работает для построения отношений, но при удалении есть некоторые предостережения. Так что обязательно ознакомьтесь с серией моих EF для получения дополнительной информации. И, в частности, этот:

Совет 9 - Как удалить объект без его извлечения

Надеюсь, это поможет

Alex

1 голос
/ 29 июля 2009

Можно сделать то, что вы просите. Вам нужно будет сделать что-то вроде следующего:

dealEntities.symbolReference.EntityKey = new EntityKey ("Entities.SymbolSet", "Id", 5);

Это имеет смысл? Я могу перепутать названия ваших сущностей, поэтому спросите меня, нужна ли вам дополнительная информация.

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