Как я могу прикрепить объект 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 =)
Ответы
Ответ 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())
работает отлично. Удивление, если я что-то упустил? Или это не правильный путь?