Как я могу прикрепить объект Entity Framework, который не из базы данных?

.net-3.5 c# entity-framework linq-to-entities

Вопрос

У меня есть полное разделение моих объектов 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 не может быть присоединен к контексту объекта.

РЕДАКТИРОВАТЬ: Похоже, я должен использовать лица.AttachTo ("Авторы", dbAuthor); присоединить без EntityKey, но тогда у меня есть жестко закодированные магические строки, которые прервутся, если я вообще изменю имена наборов сущностей, и у меня не будет никакой проверки времени компиляции ... Есть ли способ, которым я могу присоединиться, который сохраняет проверку времени компиляции ?

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

Принятый ответ

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

entities.AttachTo("Authors", dbAuthor);

где "Authors" будут вашим реальным именем набора сущностей.

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

entities.AddToAuthors(dbAuthor);

который буквально должен быть:

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

определяется в файле whateverobjectcontext.designer.cs.


Популярные ответы

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

ctx.AttachTo("EntitySet", entity);

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

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

ctx.AttachToDefault(entity);

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

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

ctx.EntitySet.Attach(entity);

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

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

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

Alex



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow