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

本文关键字:我的 Repository 方法 操作方法 对象 Controller | 更新日期: 2023-09-27 18:28:09

我正在做一个asp.net mvc 5 web项目,我创建了一个Repository Model类来与我的数据库交互,我正在从我的操作方法调用我的存储库。例如,在我的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");
                }
            }}

这是存储库模型分类:-

 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;
            }
        }

因此,我的问题是,当我将对象从操作方法传递到存储库时,实体框架将如何处理该对象;它会在存储库中创建另一个副本,还是会跟踪同一个对象?。如果实体框架将在会话中的操作方法和存储库方法中处理同一对象,那么实体框架是如何跟踪对象的呢?

第二个问题,最好的方法是什么;将整个对象从操作方法传递到存储库(正如我目前所做的那样),或者只传递对象id,并在存储库模型中再次检索对象,如下所示:-

repository.InsertOrUpdateRole(Role.RoleID);

并且在储存库内

public void InsertOrUpdateRole(int id)
{
var SecurityRole = t.SecurityRoles.SingleOrDefault(a => a.SecurityRoleID == role.SecurityRoleID);
}

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

在C#中,对象是通过引用传递的。当您在ActionResult中保存一个新的role时,您会注意到它在InsertOrUpdateRole调用后得到了一个Id。EF开始跟踪上下文中一有内容就发生的变化。所以你的第一种方法很好(我也用它)。确保模型在设置了所有值的情况下传递给InsertOrUpdateRole函数,EF将覆盖整个记录,因此如果您在视图中忘记了某个属性,它将在数据库中变为空值。如果您只想更新模型的一些属性,请使用第二种方法。