ASP.NET MVC 프로젝트에서 저장소의 SaveItem 메서드로 업데이트하려고합니다. Entity Framework 6.1을 사용합니다. 나는 예외가있다. 이 문제를 어떻게 해결할 수 있습니까?리포지토리의 개체를 수정할 수 없습니다.
동일한 유형의 다른 엔터티가 이미 동일한 기본 키 값을 갖고 있기 때문에 'Domain.Entities.Post'유형의 엔터티를 연결하지 못했습니다. 이것은 'Attach'방법을 사용하거나 그래프의 엔티티 중 하나가 충돌하는 키 값을 갖는 경우 엔티티의 상태를 '변경되지 않음'또는 '수정 됨'으로 설정할 때 발생할 수 있습니다. 이는 일부 엔티티가 새롭고 아직 데이터베이스 생성 키 값을 수신하지 않았기 때문일 수 있습니다. 이 경우 'Add'메소드 또는 'Added'엔티티 상태를 사용하여 그래프를 추적 한 다음 비 신규 엔티티의 상태를 'Unchanged'또는 'Modified'로 적절하게 설정하십시오.
내 저장소 : 나는 편집의 논리를 imlpemented 컨트롤러에서
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});
}
}
중단 점이있는 디버그 모드로 실행하려고 시도 했습니까? –
예 시도해 보았습니다. 예외가 발생했습니다 – MasterMedia
그리고 변수 값이 어땠는지, QuickWatch 또는 무언가를 사용해 보았습니다. –