Asp.net mvc 通用保存方法
在我的通用存储库中,我需要编写通用保存方法,该方法将根据id编辑现有实体或添加新实体Asp.net mvc 通用保存方法,asp.net-mvc,linq,entity-framework,generics,asp.net-mvc-4,Asp.net Mvc,Linq,Entity Framework,Generics,Asp.net Mvc 4,在我的通用存储库中,我需要编写通用保存方法,该方法将根据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); }
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);
}
}
public void Save(T实体),其中T:tenty,IKeyId
{
if(ObjectSet.Any(r=>(r作为IKeyId.KeyId==entity.KeyId))
{
编辑(实体);
}
其他的
{
添加(实体);
}
}
但当我尝试执行Any(r=>(r作为IKeyId)…
时,Linq会生成异常。
不支持输入类型为“MyProg.DAL.Appeal”且检查类型为“Claimstrak.DAL.Interfaces.IKeyId”的“TypeAs”表达式。LINQ to Entities查询中仅支持实体类型和复杂类型
如何正确地编写它?事实上,您不需要使用ObjectSet,只需使用DbContext,以一种更简单的方式来完成
Bu,我会告诉你,这不是一个好的使用模式,在存储库中调用SAVER()。我会重申,在所有的工作完成之后,你只考虑上下文的.SaveSeSeSe(),这样你就可以做很多事情去TE数据库。 因此,您应该创建一个这样的方法,但不要将SaveChanges()而不是Save()方法调用到UpdateOrInsert()和它们,在所有操作完成后,您可以调用.Save()方法
但我会根据你的要求给出一个例子(但我不建议,我建议你将我的工作与我的假设分开) 看看代码是如何非常简单的: 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;
}
接口IKeyId
{
int Id{get;set;}
}
DbContext=newyourcontext();
公共bool Save(tenty实体),其中tenty:class,IKeyId
{
返回(entity.Id==0)?增加(entity):编辑(entity);
}
公共布尔编辑(tenty实体),其中tenty:class,IKeyId
{
var set=context.set();
集合。附加(实体);
返回true;
}
公共bool Add(tenty实体),其中tenty:class,IKeyId
{
var set=context.set();
设置、添加(实体);
返回true;
}
我在我的存储库中使用了类似的方法,我更改了T4(.tt文件)这将从我的数据库生成POCO类,以方便地实现我拥有的一些接口,例如IAuditable、IValidatable和其他接口,因此T4将自动在类中实现这些接口。好的,例外是很明显的,您不能使用linq中的接口转换为实体…现在,为了找到解决方案,请稍微详细一点e(例如,为了理解如何以及为什么使用ObjectSet)会很有用。您知道EF会告诉您实体是新的、修改的还是删除的。我知道。不幸的是,该表中的键(id)不是自己的id。列是对另一个表的引用,不是标识。