当前位置:  开发笔记 > 编程语言 > 正文

如何附加不是来自数据库的Entity Framework对象?

如何解决《如何附加不是来自数据库的EntityFramework对象?》经验,为你挑选了3个好方法。

我完全分离了我的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附加,但后来我有硬编码的魔术字符串,如果我改变我的实体集名称将会破坏我不会有任何编译时间检查...有没有一种方法可以附加,保持编译时间检查?

我希望我能够做到这一点,因为硬编码字符串会导致编译时间验证失败=)



1> Alex James..:

刚刚看到这个.如果你想Attach()到ObjectContext,即说服实体框架已经存在数据库中的实体,并且你想避免使用魔术字符串,即

ctx.AttachTo("EntitySet", entity);

你可以尝试两种基于扩展方法的可能性,这两种方法都可以让生活变得更加可以忍受.

第一个选项允许您编写:

ctx.AttachToDefault(entity);

并在此处介绍:技巧13 - 如何以简单的方式附加实体

第二个选项允许您编写:

ctx.EntitySet.Attach(entity);

并在此处介绍:技巧16 - 今天如何模仿.NET 4.0的ObjectSet

正如您所看到的,两者都非常易于使用并完全避免使用字符串.

希望这可以帮助

亚历克斯



2> Quintin Robi..:

您是否尝试过使用AttachTo并指定实体集?

entities.AttachTo("Authors", dbAuthor);

"Authors"你的实际实体集名称在哪里?

编辑:
是的,有更好的方法(应该有).设计者应该为ObjectContext 生成"添加"方法,转换为上面的调用..所以你应该能够做到:

entities.AddToAuthors(dbAuthor);

这应该是:

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

在whateverobjectcontext.designer.cs文件中定义.


这似乎有效,但随后我在每个地方都有"魔术字符串",如果我重命名实体集,我的所有代码都会破坏.有一个更好的方法吗?

3> sebagomez..:

如果您不想使用EntitySet名称编写字符串,请尝试此操作

entities.AttachTo(entities.CreateObjectSet().EntitySet.Name, entity);

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有