Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

entities.AttachTo("Authors", dbAuthor);

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

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

entities.AddToAuthors(dbAuthor);

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

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

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

Ответ 2

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

ctx.AttachTo("EntitySet", entity);

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

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

ctx.AttachToDefault(entity);

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

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

ctx.EntitySet.Attach(entity);

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

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

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

Алекс

Ответ 3

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

entities.AttachTo(entities.CreateObjectSet<T>().EntitySet.Name, entity);

Ответ 4

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

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

Ответ 5

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

entities.AddToAuthors(dbAuthor);

Ответ 6

Для меня

Context.Authors.AddObject(new Author())

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