2010-09-27 53 views
1

这可能是一个简单的解决方案,但是....实体框架4 POCO CRUD存储库 - 如何执行智能插入/更新?

如果我有一个实体框架4 Repository中的公开以下接口:

void InsertOrUpdate(Foo foo); 

我的EDM与定制POCO的完成(无码代),我如何执行POCO的更新?

我可以INSERT一个新对象通过这样做:

var newFoo = new Foo { ... }; 
repo.InsertOrUpdate(newFoo); 

,如果我实现与ObjectContext.AddObject该方法的工作原理。

但如果我尝试和UPDATE对象:

var existingFoo = repo.Find(foo); 
existingFoo.Name = "Changed the foo!"; 
repo.InsertOrUpdate(existingFoo); 

我得到一个错误说使用相同的密钥已经存在,这是有道理的实体 - 但我虽然ObjectContext.AddObject方法足够聪明地做INSERT或更新?

我们如何处理EF4 POCO Repos中的插入和更新?我是否必须首先对数据库进行查询以查看它是否存在,如果不是,那么执行AddObject,如果是 - 我该怎么办?

回答

1

因此,我需要在DataContext上执行SaveChanges,而不是在执行Update时执行AddObject。

我已经有一个方法叫做提交通过我的DataContext接口公开,它做了一个SaveChanges。

我改名为InsertOrUpdate方法添加

所以现在,插入一个新的实体:

var newFoo = new Foo { ... }; 
repo.Add(newFoo); 

更新现有的实体:

var existingFoo = repo.Find(foo); 
existingFoo.Name = "Changed the foo!"; 
myCtx.Commit();