在我的通用存储库中,我需要编写通用 Save 方法,该方法将根据 id 编辑现有实体或添加新实体。
public void Save<T>(T entity) where T : TEntity, IKeyId
{
if (ObjectSet.Any(r => (r as IKeyId).KeyId == entity.KeyId))
{
Edit(entity);
}
else
{
Add(entity);
}
}
但是当我尝试这样做时,Linq 会生成异常Any( r=> (r as IKeyId)...
.
不支持输入类型为“MyProg.DAL.Appeal”且检查类型为“Claimstrak.DAL.Interfaces.IKeyId”的“TypeAs”表达式。 LINQ to Entities 查询仅支持实体类型和复杂类型。
怎么写才正确呢?
好吧,事实是您不需要使用 ObjectSet,您可以使用 DbContext 以更简单的方式来完成此操作。
Bu,我想说这不是一个好的使用模式,在存储库中调用 Save() 。我建议您仅在完成所有操作后才考虑上下文的 .SaveSession() ,这样您可以在往返数据库之前做很多事情。
因此,您应该创建这样的方法,但不要对 UpdateOrInsert() 调用 SaveChanges() 而不是 Save() 方法,并且在完成后调用 .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 自动实现这些接口类中的接口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)