【发布时间】:2016-09-19 00:37:06
【问题描述】:
我正在尝试在 MVC 应用程序中使用带有 EntityFramework 的存储库模式来更新记录,但是 db.SaveChanges() 方法没有保存到数据库中。我没有收到任何错误,我可以单步执行代码并查看正确的变量是否被传递,以及记录变量是否得到更新。
根据我一直在阅读的内容,我认为我的问题是我的数据库上下文 (MyDBEntities) 有两个实例。问题可能是我的创建 MyDBEntities 实例的 ReadRepository 被注入到 WriteRepository 中,WriteRepository 也创建了一个实例 MyDBEntities。我不确定如何将实体注入存储库(假设这是我需要做的)。
如果我尝试在db.SaveChanges() 之前添加类似db.MyTable.Attach(record); 的内容,我会在下面收到此错误,这让我觉得我需要注入MyDBEntities()。
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
控制器
public class MyController : Controller
{
private IWriteRepository _writeRepository;
public MyController(IWriteRepository writeRepository)
{
_writeRepository = writeRepository;
}
[HttpPost]
public ActionResult MyPostMethod(MyViewModel model)
{
try
{
//Send to the repository to edit a record
writeRepository.EditRecord(model);
return new HttpStatusCodeResult(HttpStatusCode.OK);
}
catch
{
throw new HttpException(500, "Internal Server Error");
}
}
}
写存储库
//The ReadRepository is injected into the WriteRepository to grab records from the database
public class WriteRepository : IWriteRepository
{
private MyDBEntities db = new MyDBEntities();
private IReadRepository _readRepository;
public WriteRepository(IReadRepository readeadRepository)
{
_readRepository = readRepository;
}
public void EditRecord(MyViewModel model)
{
//Get the specific record to be updated
var record = readRepository.GetRecord(model.ID);
//Update the data
record.FirstName = model.Name;
//This isn't saving
db.SaveChanges();
}
}
读取存储库
public class ReadRepository : IReadRepository
{
private MyDBEntities db = new MyDBEntities();
//Provides the record to the write repository to edit
public MyTable GetRecord(int ID)
{
var record = (from t in db.MyTable
where t.ID == ID
select t).SingleOrDefault();
return record;
}
}
【问题讨论】:
-
我确实读过那个,但我正在寻求帮助的部分是关于如何在存储库之外创建数据库上下文。
标签: asp.net-mvc entity-framework dependency-injection repository-pattern