如何传递lambda Expression for Generic方法的参数以检查MVC EF 4.0中的重复项
我的应用程序中有超过10个设置屏幕。 在每个中我都要检查重复数据。 例如,这是一个示例代码。
private void CheckDuplication(AIRLINE airline) { var AIRLINE = context.AIRLINEs.Where(f => f.ABBREVATION == airline.ABBREVATION).FirstOrDefault(); if (AIRLINE == null) { context.AIRLINEs.Add(airline); } else { ModelState.AddModelError("ABBREVATION", "Abbreviation already exists."); } }
对于每个设置,在整个项目中使用几乎相同的代码。 我想让这个方法通用,这样我就可以在需要检查Duplicates的地方调用它。 为此,我必须将参数传递给将设置“Lambda Expression”的generics函数。 我已经创建了一个静态类来从我的应用程序中的任何位置访问它。 问题是如何将参数传递给这样的类(包含generics方法),该类将为不同的表和列设置lambda表达式并显示通用错误消息。在此先感谢。
entity framework已经提供了一种机制,通过AddOrUpdate
方法检查数据库中是否存在实体。 你可以在这样的方法中使用它:
using System.Data.Entity.Migrations; ... public static string AddWhenNew(DbContext context, Expression> identifierExpression, T item) where T : class { var error = string.Empty; context.Set ().AddOrUpdate(identifierExpression, item); if (context.Entry(item).State != System.Data.Entity.EntityState.Added) { error = string.Format("{0} '{1}' already exists", item.GetType().Name, identifierExpression.Compile()(item)); } return error; }
在一些静态实用程序类中。
用法:
var error = Util.AddWhenNew(context, a => a.ABBREVATION, airline); if (!string.IsNullOrEmpty(error)) {
等等
我故意检查State != EntityState.Added
因为实体的状态可以在这里Attached
或Modified
(当它具有相同的ABBREVATION
但另一个属性不同时ABBREVATION
)。 但实际上,当实体未Added
,由于AddOrUpdate
中的错误 ,其状态被错误地报告为Detached
。
因此,您必须确保在添加对象时仅调用SaveChanges
,然后处置上下文,否则您可能会无意中保存其他修改。
试试这种方法(参见下面的代码)
public void TestCase(object sender, EventArgs e) { var entity = new AIRLINE(){ Name = "111" }; if(IsExists(entity, en => en.Name == entity.Name)) throw new Exception("Already exists"); } public class AIRLINE { public string Name { get; set; } } DbContext context = new DbContext(null); public bool IsExists(TEntity entity, Expression> condition) where TEntity : class { DbSet dataSet = context.Set (); if(!dataSet.Any(condition)) { dataSet.Add(entity); return false; } else return true; }