如何传递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因为实体的状态可以在这里AttachedModified (当它具有相同的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; }