23

我完全分离了我的实体框架对象和我的 POCO 对象,我只是来回翻译它们......

IE:

// 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 值的对象不能附加到对象上下文。

编辑: 看起来我必须使用entities.AttachTo("Authors", dbAuthor); 在没有 EntityKey 的情况下附加,但是我有硬编码的魔法字符串,如果我完全更改我的实体集名称,它会中断并且我不会有任何编译时间检查...有没有一种方法可以附加来保持编译时间检查?

我希望我能够做到这一点,因为硬编码的字符串会扼杀编译时验证 =)

4

6 回答 6

15

现在才看到这个。如果你想 Attach() 到 ObjectContext,即让实体框架相信一个实体已经存在于数据库中,并且你想避免使用魔术字符串,即

ctx.AttachTo("EntitySet", entity);

你可以尝试基于扩展方法的两种可能性,这两种可能性都绝对让生活更容易忍受。

第一个选项允许您编写:

ctx.AttachToDefault(entity);

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

第二个选项允许您编写:

ctx.EntitySet.Attach(entity);

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

如您所见,两者都非常易于使用并且完全避免使用字符串。

希望这可以帮助

亚历克斯

于 2009-05-08T06:51:06.803 回答
13

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

entities.AttachTo("Authors", dbAuthor);

"Authors"您的实际实体集名称在哪里。

编辑:
是的,有更好的方法(应该有)。设计人员应该已经为您生成了 ObjectContext 的“添加”方法,这些方法可以转换为上面的调用。所以您应该能够做到:

entities.AddToAuthors(dbAuthor);

从字面上看应该是:

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

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

于 2009-03-31T06:22:14.603 回答
5

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

entities.AttachTo(entities.CreateObjectSet<T>().EntitySet.Name, entity);
于 2010-11-16T03:32:16.153 回答
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);
于 2012-11-15T03:10:05.240 回答
0

你可以尝试以下

entities.AddToAuthors(dbAuthor);
于 2012-08-21T19:57:43.757 回答
-2

为了我,

Context.Authors.AddObject(new Author())

完美运行。想知道我是否遗漏了什么?或者这不是正确的方法?

于 2010-10-13T14:36:52.850 回答