我正在开发一个asp.net mvc 5 web项目,我创建了一个Repository Model类来与我的数据库交互,我从我的action方法调用我的存储库。例如,在我的Post Edit操作方法中,我有以下代码: -
Repository repository = new Repository();
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(SecurityRole Role)
{
try
{
if (ModelState.IsValid)
{
repository.InsertOrUpdateRole(Role);
repository.Save();
return RedirectToAction("Index");
}
}}
这是存储库模型clas: -
public class Repository
{
private TEntities tms = new TEntities();
public void InsertOrUpdateRole(SecurityRole role)
{
role.Name = role.Name.Trim();
if (role.SecurityRoleID == default(int))
{
// New entity
//Code goes here
else
{
t.Entry(role).State = EntityState.Modified;
}
}
所以我的问题是当我将对象从我的操作方法传递到我的存储库时,Entity Framework将如何处理该对象;它会在存储库中创建另一个副本,还是会跟踪同一个对象?如果实体框架将在action方法内部和session中的repository方法中处理相同的对象,那么实体框架如何跟踪对象?
第二个问题,最好的方法是什么?将整个对象从action方法传递到存储库(正如我现在所做的那样),或者代之以仅传递对象id,并在存储库模型中再次检索对象,如下所示: -
repository.InsertOrUpdateRole(Role.RoleID);
并在存储库中
public void InsertOrUpdateRole(int id)
{
var SecurityRole = t.SecurityRoles.SingleOrDefault(a => a.SecurityRoleID == role.SecurityRoleID);
}
答案 0 :(得分:2)
在C#中,对象通过引用传递。当您在role
中保存新的ActionResult
时,您会发现Id
电话后InsertOrUpdateRole
已InsertOrUpdateRole
。一旦附加到上下文,EF就开始跟踪更改。所以你的第一种方法工作正常(我也使用它)。确保将模型传递给{{1}}函数并设置其所有值,EF将覆盖整个记录,因此如果您忘记了视图中的属性,它将成为数据库中的空值。如果您只想更新模型的一些属性,请使用第二种方法。