Как я могу прикрепить объект Entity Framework, который не из базы данных? - PullRequest
22 голосов
/ 31 марта 2009

У меня есть полное разделение моих объектов Entity Framework и моих объектов POCO, я просто перевожу их туда-сюда ...

т.е:

// poco
public class Author
{
   public Guid Id { get; set; }
   public string UserName { get; set; }
}

и затем у меня есть объект EF "Авторы" с теми же свойствами ..

Итак, у меня есть бизнес-объект

var author = new Author { UserName="foo", Id="Guid thats in the db" };

и я хочу сохранить этот объект, поэтому я делаю следующее:

var dbAuthor = new dbAuthor { Id=author.Id, UserName=author.UserName };
entities.Attach(dbAuthor);
entities.SaveChanges();

но это дает мне следующую ошибку:

Объект с нулевым значением EntityKey не может быть прикреплен к объекту контекст.

EDIT: Похоже, я должен использовать entity.AttachTo ("Авторы", dbAuthor); прикрепить без EntityKey, но тогда у меня есть жестко закодированные магические строки, которые прервутся, если я вообще изменю имена наборов сущностей, и у меня не будет никакой проверки времени компиляции ... Есть ли способ, которым я могу присоединиться, который сохраняет проверку времени компиляции

Я надеюсь, что смогу сделать это, так как жестко закодированные строки, убивающие валидацию времени компиляции, будут отстойными =)

Ответы [ 6 ]

15 голосов
/ 08 мая 2009

Просто вижу это сейчас. Если вы хотите присоединить () к ObjectContext, то есть убедить платформу сущностей в том, что сущность уже существует в базе данных, и вы хотите избежать использования магических строк, т.е.

ctx.AttachTo("EntitySet", entity);

Вы можете попробовать две возможности, основанные на методах расширения, которые определенно сделают жизнь более терпимой.

Первый вариант позволяет написать:

ctx.AttachToDefault(entity);

и рассматривается здесь: Совет 13 - Как легко прикрепить объект

Второй вариант позволяет написать:

ctx.EntitySet.Attach(entity);

и рассматривается здесь: Совет 16. Как имитировать ObjectSet .NET 4.0 сегодня

Как вы можете видеть, оба очень просты в использовании и полностью избегают строк.

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

Alex

13 голосов
/ 31 марта 2009

Вы пытались использовать AttachTo и указывать набор сущностей? ..

entities.AttachTo("Authors", dbAuthor);

где "Authors" будет вашим фактическим именем набора сущностей.

Edit:
Да, есть лучший способ (ну, должно быть). Дизайнер должен был сгенерировать методы "Добавить" для ObjectContext для вас, которые будут преобразованы в вызов выше. Так что вы должны быть в состоянии сделать:

entities.AddToAuthors(dbAuthor);

что буквально должно быть:

public void AddToAuthors(Authors authors)
{
    base.AddObject("Authors", authors);
}

определено в файле whateverobjectcontext.designer.cs.

5 голосов
/ 16 ноября 2010

Попробуйте, если не хотите писать строку с именем EntitySet

entities.AttachTo(entities.CreateObjectSet<T>().EntitySet.Name, entity);
4 голосов
/ 15 ноября 2012

альтернативой этому является, в частности, следующее, если вы не знаете, над какой сущностью вы собираетесь работать:

string className = entityObject.GetType().Name;
var container = _DbContext.MetadataWorkspace.GetEntityContainer(_DbContext.DefaultContainerName, DataSpace.CSpace);
string setName = (from meta in container.BaseEntitySets
                  where meta.ElementType.Name == className
                  select meta.Name).First();
_DbContext.AttachTo(setName, entityObject);
0 голосов
/ 21 августа 2012

Можете ли вы попробовать следующие

entities.AddToAuthors(dbAuthor);
0 голосов
/ 13 октября 2010

Для меня

Context.Authors.AddObject(new Author())

работает отлично. Хотите знать, если я что-то упустил? Или это не правильный путь?

...