[英]EF code first InsertOrUpdate with return T
我目前有一個代碼,可以插入或更新並返回受影響的實體,但現在它返回的是特定類型
public delegate void BeforeTransaction(tbl_purchases_record x);
public static tbl_purchases_record insertupdate(
tbl_purchases_record param,
DB context,
Func<tbl_purchases_record,bool> lambda,
BeforeTransaction beforetransaction = null)
{
var entity = context.tbl_purchases_record.SingleOrDefault(lambda);
beforetransaction?.Invoke(entity); // callable parameter
if (entity == null)
{
entity = context.tbl_purchases_record.Add(param);
}
else
{
context.Entry(entity).CurrentValues.SetValues(param);
}
context.SaveChanges();
return entity;
}
是否可以使此返回動態類型? (也想問...這是不好的做法嗎?)
根據您的評論:
是的,我可以這樣做..但是我的問題是context.tbl_purchases_record.SingleOrDefault(lambda)...我嘗試使用context.Set(typeof(TEntity))但這沒有SingleOrDefault
使用通用方法時,要使用的正確語法是:
context.Set<TEntity>().FirstOrDefault();
您只需傳遞通用參數。
放在一起:
public T InsertUpdate<T>(T obj, DB context, Func<T,bool> lambda)
{
var entity = context.Set<T>().SingleOrDefault(lambda);
if (entity == null)
{
entity = context.Set<T>().Add(obj);
}
else
{
context.Entry(entity).CurrentValues.SetValues(obj);
}
context.SaveChanges();
return entity;
}
還要注意,在較新版本的EF中,實際上有一個AddOrUpdate
方法可以執行相同的操作:
context.Set<T>().AddOrUpdate(
lambda, //How to identify a pre-existing item
obj //The item with new values
);
它將做同樣的事情。 如果找到預先存在的項目,它將對其進行更新。 否則它將創建一個新項目。 但是,這將不會返回創建/更新的項目 ,因此可能不是您要在此處使用的項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.