将对象从我的Controller操作方法传递到我的Repository方法

时间:2014-10-28 10:44:31

标签: c# asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-5

我正在开发一个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);
}

1 个答案:

答案 0 :(得分:2)

在C#中,对象通过引用传递。当您在role中保存新的ActionResult时,您会发现Id电话后InsertOrUpdateRoleInsertOrUpdateRole。一旦附加到上下文,EF就开始跟踪更改。所以你的第一种方法工作正常(我也使用它)。确保将模型传递给{{1}}函数并设置其所有值,EF将覆盖整个记录,因此如果您忘记了视图中的属性,它将成为数据库中的空值。如果您只想更新模型的一些属性,请使用第二种方法。