【发布时间】:2014-09-18 14:03:17
【问题描述】:
在 ASP.NET MVC 项目中,我尝试使用存储库中的 SaveItem item 方法进行更新。我使用实体框架 6.1。我得到了例外。我该如何解决这个问题?
附加类型为“Domain.Entities.Post”的实体失败,因为同一类型的另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后将非新实体的状态设置为“未更改”或“已修改”。
我的仓库:
public class BlogRepository<T> : IBlogRepository<T> where T : class
{
private readonly DbContext context;
private readonly IDbSet<T> dbSet;
public BlogRepository()
{
this.context = new BlogDbContext();
dbSet = context.Set<T>();
}
public BlogRepository(DbContext context, IDbSet<T> dbSet)
{
this.context = context;
this.dbSet = dbSet;
}
public void SaveItem(T item)
{
object value = Reflector.GetPropertyValue(item);
var foundItem = dbSet.Find((int) value);
if (foundItem == default(T))
dbSet.Add(item);
else
{
context.Entry(item).State = EntityState.Modified;
}
context.SaveChanges();
}
public void Delete(T item)
{
dbSet.Remove(item);
context.SaveChanges();
}
public T GetById(int id)
{
return dbSet.Find(id);
}
public IEnumerable<T> GetAll()
{
return dbSet.AsEnumerable();
}
}
在控制器中我实现了编辑逻辑
public class PostController : Controller
{
private readonly IBlogRepository<Post> blogRepository;
public PostController(IBlogRepository<Post> blogRepository)
{
this.blogRepository = blogRepository;
}
public ActionResult Index(int id = 1)
{
Post post = blogRepository.GetById(id);
return View(post);
}
public ActionResult Edit(int id)
{
Post post = blogRepository.GetById(id);
return View(post);
}
[HttpPost]
public ActionResult Edit(Post post)
{
if (ModelState.IsValid)
{
blogRepository.SaveItem(post);
return RedirectToAction("Index", new { id = post.Id });
}
return View(post);
}
public ActionResult Create()
{
return View("Edit", new Post {Date = DateTime.Now});
}
}
【问题讨论】:
-
您是否尝试过在带有断点的调试模式下运行,看看会发生什么?
-
是的,我试过了,它引发了异常
-
那么你的变量值是多少,你有没有使用一些 QuickWatch 或其他东西来看看引擎盖下发生了什么?
标签: c# asp.net-mvc entity-framework repository-pattern