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