好吧,事实是您不需要使用 ObjectSet,您可以使用 DbContext 以更简单的方式执行此操作。
Bu,我会说这不是一个好的模式,在存储库中调用 Save()。我建议您仅在完成后才考虑 Context 的 .SaveSession() ,这样您可以在往返于 te 数据库之前做很多事情。
所以,你应该创建一个这样的方法,但不要调用 SaveChanges(),而不是 Save() 方法,调用 UpdateOrInsert() 和它们,毕竟你调用了 .Save()
但是我会根据您的要求给出示例(但我不推荐,我建议您将 IUnitOfWork 与 IRepository 分开)
看看代码如何非常简单:
interface IKeyId
{
int Id { get; set; }
}
DbContext context = new YourContext();
public bool Save<TEntity>(TEntity entity) where TEntity : class, IKeyId
{
return (entity.Id == 0) ? Add<TEntity>(entity) : Edit<TEntity>(entity);
}
public bool Edit<TEntity>(TEntity entity) where TEntity : class, IKeyId
{
var set = context.Set<TEntity>();
set.Attach(entity);
return true;
}
public bool Add<TEntity>(TEntity entity) where TEntity : class, IKeyId
{
var set = context.Set<TEntity>();
set.Add(entity);
return true;
}
我在我的存储库中使用了类似的方法,我已经更改了从我的数据库生成 POCO 类的 T4(.tt 文件),以明确实现我拥有的一些接口,例如 IAuditable、IValidatable 等,因此 T4 自动实现了这些类中的接口。