我完全分离了我的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();
但是这给了我以下错误:
具有null EntityKey值的对象 不能附加到对象 上下文。
修改 看起来我必须使用entities.AttachTo(“作者”,dbAuthor);没有EntityKey附加,但后来我有硬编码的魔术字符串,如果我改变我的实体集名称将会破坏我不会有任何编译时间检查...有没有一种方法可以附加,保持编译时间检查?
我希望我能够做到这一点,因为硬编码字符串会导致编译时间验证失败=)
答案 0 :(得分:15)
现在就看到这个。如果你想Attach()到ObjectContext,即说服实体框架已经存在数据库中的实体,并且你想避免使用魔术字符串,即
ctx.AttachTo("EntitySet", entity);
你可以尝试两种基于扩展方法的可能性,这两种方法都可以让生活变得更加可以忍受。
第一个选项允许你写:
ctx.AttachToDefault(entity);
并在此处介绍:Tip 13 - How to attach an entity the easy way
第二个选项允许你写:
ctx.EntitySet.Attach(entity);
并在此处介绍:Tip 16 - How to mimic .NET 4.0's ObjectSet today
正如您所看到的,两者都非常易于使用并完全避免使用字符串。
希望这有帮助
亚历
答案 1 :(得分:13)
您是否尝试过使用AttachTo并指定实体集?..
entities.AttachTo("Authors", dbAuthor);
其中"Authors"
将是您的实际实体集名称。
编辑:
是的,有更好的方法(应该有)。设计者应该为你生成"Add" methods给你的ObjectContext,它转换为上面的调用..所以你应该能够做到:
entities.AddToAuthors(dbAuthor);
字面上应该是:
public void AddToAuthors(Authors authors)
{
base.AddObject("Authors", authors);
}
答案 2 :(得分:5)
如果您不想使用EntitySet名称
编写字符串,请尝试此操作entities.AttachTo(entities.CreateObjectSet<T>().EntitySet.Name, entity);
答案 3 :(得分: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);
答案 4 :(得分:0)
你可以试试
吗?entities.AddToAuthors(dbAuthor);
答案 5 :(得分:-2)
对我来说,
Context.Authors.AddObject(new Author())
完美无缺。想知道我是否遗漏了什么?或者这不是正确的方法?