1
我有我的数据库上下文:ASP.NET MVC 3数据库上下文查询
public class ProductContext : DbContext
{
public ProductContext() : base ("DefaultConnection") {}
public DbSet<Product> Products {get;set;}
}
和我的仓库:
public class ProductRepository : IProductRepository
{
private ProductContext _dbContext = new ProductContext();
public IQueryable<Product> Products { get { return _dbContext.Products; } }
}
当我查询我的Edit
Action
数据库:
public ActionResult Edit(Guid id)
{
var item = _repository.Products.FirstOrDefault(x => x.Id.Equals(id));
return View(item);
}
我通常会用一个ViewModel
但这纯粹是为了展示场景。
当我使用var item
行查询数据库时,EntityFramework
是否更改item
的状态。
我可以传递item
各地通过Services
在Service Layer
众多,最后用我的方法保存:
public void SaveEntity<TEntity>(TEntity entityToSave) where TEntity : DbEntity
{
if (entityToSave.Id.Equals(Guid.Empty))
_dbContext.Set<TEntity>().Add(entityToSave);
else
_dbContext.Entry<TEntity>(entityToSave).State = EntityState.Modified;
_dbContext.SaveChanges();
}
它不会抛出一个异常说,已经有一个Entity
与与您试图保存的那个相同Id
?
EF将尝试再次插入该类别,因为它很可能会附加到您的'DbContext'的另一个实例。 EF无法知道该类别已存在,所以它会尝试插入它,从而导致重复的键错误。这个问题可以通过在整个请求中使用'DbContext'的相同实例来解决。如上所述填写外键字段将工作得很好。 –
是的,我认为这是问题,但我注入这将使用'DbContext'的一个实例库,我走动的地方实体,所以它只是更容易使用'Id'领域。 –
确保您为请求的范围创建实例。 –