gpt4 book ai didi

c# - 对 MVC 中的实体所做的更改未提交到数据库

转载 作者:太空宇宙 更新时间:2023-11-03 13:19:58 26 4
gpt4 key购买 nike

我正在使用存储库模式和 Entity Framework 与我的数据库和核心内容进行通信。

当我尝试更改用户实体(更改电子邮件地址、用户名等)时,它不会在数据库中提交此更改。我意识到我在我的存储库中遗漏了更新方法中的一些东西,我遇到的麻烦是找到我遗漏的东西。有什么想法我想念的吗?对存储库模式非常陌生。

我一直在关注教程 - https://workspaces.codeproject.com/user-10620241/architecture-guide-asp-net-mvc-framework-n-tier-en

MVC Controller

public ActionResult Details(int id = 0)
{
UserModel user = _userService.GetSingle(u => u.Id == id);

if (user == null)
{
return HttpNotFound();
}
return View(user);
}

[HttpPost]
public ActionResult Details(UserModel model)
{
if (ModelState.IsValid)
{
_userService.Update(model);

return RedirectToAction("Index");
}

return View(model);
}

RepositoryBase.cs

public abstract class RepositoryBase<T> : IRepository<T>
where T: class
{
public RepositoryBase()
: this(new ObRepositoryContext())
{
}

public RepositoryBase(IRepositoryContext repositoryContext)
{
repositoryContext = repositoryContext ?? new ObRepositoryContext();
_objectSet = repositoryContext.GetObjectSet<T>();
}

private IObjectSet<T> _objectSet;
public IObjectSet<T> ObjectSet
{
get
{
return _objectSet;
}
}

#region IRepository Members

public void Add(T entity)
{
if (entity == null)
throw new ArgumentNullException("entity");

this.ObjectSet.AddObject(entity);
}

public void Update(T entity)
{
if (entity == null)
throw new ArgumentNullException("entity");

this._objectSet.Attach(entity);

//TODO: Commit update to database here
}

public void Delete(T entity)
{
if (entity == null)
throw new ArgumentNullException("entity");

this.ObjectSet.DeleteObject(entity);
}

public IList<T> GetAll()
{
return this.ObjectSet.ToList<T>();
}

public IList<T> GetAll(Expression<Func<T, bool>> whereCondition)
{
return this.ObjectSet.Where(whereCondition).ToList<T>();
}

public T GetSingle(Expression<Func<T, bool>> whereCondition)
{
return this.ObjectSet.Where(whereCondition).FirstOrDefault<T>();
}

public void Attach(T entity)
{
this.ObjectSet.Attach(entity);
}

public IQueryable<T> GetQueryable()
{
return this.ObjectSet.AsQueryable<T>();
}

public long Count()
{
return this.ObjectSet.LongCount<T>();
}

public long Count(Expression<Func<T, bool>> whereCondition)
{
return this.ObjectSet.Where(whereCondition).LongCount<T>();
}

#endregion

}

最佳答案

好吧,你似乎给自己留了一个 TODO :)

 //TODO: Commit update to database here

您需要将对象标记为已修改 - 以下是对此的看法:

 this.ObjectSet.Context.ObjectStateManager.ChangeObjectState(
entity, EntityState.Modified);

您还需要调用 SaveChanges在您的上下文中的某个时刻 - 您所采用的模式似乎鼓励在某个时刻进行多次更改和一次最终提交:

repositoryContext.SaveChanges();

编辑

编译错误是因为您正在使用的存储库将 ObjectSet 抽象为其接口(interface) IObjectSet。你需要再次向下转型:

  _objectSet // Or I guess (this.ObjectSet as ObjectSet<T>)
.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);

请注意,您遵循的模式是在 2010 年使用 EF 4.0 完成的。从那时起, Entity Framework 发生了很多变化,最著名的是 DBContext这缩小了与存储库模式 IMO 的大部分差距。

关于c# - 对 MVC 中的实体所做的更改未提交到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24696677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com