1

我有我的数据库上下文:

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);
}

我通常会使用 aViewModel但这纯粹是为了展示场景。

当我使用该var item行查询数据库时,确实会EntityFramework更改item.

我可以item通过多种方式传递它ServicesService 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();
}

它不会抛出异常,说已经有一个EntityId您要保存的相同?

4

1 回答 1

1

因此,经过反复试验,这似乎工作得很好,并且不会带回任何错误。有一点需要注意:

此导航属性:

public virtual Category Category { get;set; }
public Guid CategoryId { get;set; }

可能驻留在Product模型中有一个小问题,那就是:

编辑或保存新的Product时,您应该设置CategoryId而不仅仅是独占,因为如果您使用数据库中已经存在的 a ,每次编辑或保存时Category都会得到重复的条目...CategoryCategory

我认为您应该仅为您的方便而使用导航属性,而不是在修改实体时使用......

于 2013-07-09T14:55:54.907 回答