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

时间:2009-03-31 06:04:37

标签: c# entity-framework .net-3.5 linq-to-entities

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

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

6 个答案:

答案 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);
}
在whateverobjectcontext.designer.cs文件中定义。

答案 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())

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