C# 如何为MVC EF 4.0中检查重复项的泛型方法传递lambda表达式的参数
我的应用程序中有10多个设置屏幕。在每种情况下,我都必须检查重复的数据。 例如,这里有一个示例代码C# 如何为MVC EF 4.0中检查重复项的泛型方法传递lambda表达式的参数,c#,entity-framework,generics,model-view-controller,lambda,C#,Entity Framework,Generics,Model View Controller,Lambda,我的应用程序中有10多个设置屏幕。在每种情况下,我都必须检查重复的数据。 例如,这里有一个示例代码 private void CheckDuplication(AIRLINE airline) { var AIRLINE = context.AIRLINEs.Where(f => f.ABBREVATION == airline.ABBREVATION).FirstOrDefault(); if (AIRLI
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.");
}
}
在整个项目中,每个设置都使用几乎相同的代码。
我想使这个方法通用,这样我就可以在需要检查重复项的任何地方调用它。
为此,我必须将参数传递给将设置“Lambda Expression”的泛型函数。
我创建了一个静态类,可以从应用程序中的任何位置访问它。
问题是如何将参数传递给这样的类(包含泛型方法),该类将为不同的表和列设置lambda表达式,并显示泛型错误消息。。
提前感谢。试试这种方法(见下面的代码)
public void测试用例(对象发送方,事件参数e)
{
var entity=new AIRLINE(){
Name=“111”
};
if(IsExists(entity,en=>en.Name==entity.Name))
抛出新异常(“已存在”);
}
公务舱航空公司{
公共字符串名称{get;set;}
}
DbContext上下文=新的DbContext(null);
public bool IsExists(tenty实体,表达式条件),其中tenty:class{
DbSet dataSet=context.Set();
如果(!dataSet.Any(条件)){
数据集。添加(实体);
返回false;
}否则
返回true;
}
实体框架已经提供了一种机制,通过检查数据库中是否存在实体。您可以在以下方法中使用此选项:
using System.Data.Entity.Migrations;
...
public static string AddWhenNew<T>(DbContext context,
Expression<Func<T, object>> identifierExpression, T item) where T : class
{
var error = string.Empty;
context.Set<T>().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;
}
等等
我故意检查状态!=EntityState。添加了
,因为实体的状态可以在此处附加或修改(当它具有相同的缩写但另一个属性不同时进行修改)。但实际上,当实体未添加时,由于在添加或更新中出现错误,其状态被错误地报告为已分离
因此,您必须确保在添加对象时只调用
SaveChanges
,然后处理上下文,否则您可能会无意中保存其他修改。您能提供更好的使用示例吗?@JesseJames抱歉,我没能理解您的意思,此方法是在运行AIRLINE-CREATE的POST-method时调用的。你能详细解释一下你所说的例子是什么意思吗?首先,当它必须被命名为类似于AddWhenNotExists
(因为它不仅测试存在性,而且还添加了一个项)的时候,它并没有比name methodIsExists
更糟糕的了。第二,与OP相比,您的代码有什么好处?首先,这段代码展示了一种方法,它不是一个可以“复制、粘贴和发布”的示例。第二,这段代码只写一次,要检查实体,您需要写一行而不是新方法。OP不能抛出异常(他使用MVC并希望添加验证错误)。您的代码唯一可以避免的就是重复单个if
语句。嗯,最好等一下,OP什么时候会用使用示例更新问题。丹尼斯,你能提供一个更好的示例(不仅在方法命名和显示错误的方式上会有差异)吗?现在我真的很想看看应该怎么做(从去年夏天开始我就没有和EF合作过)。我不能,因为用例还不知道。对于许多变体:例如,如果条件的数量有限(按名称或类似属性搜索),则OP的所有代码都可以封装到单个方法中。
using System.Data.Entity.Migrations;
...
public static string AddWhenNew<T>(DbContext context,
Expression<Func<T, object>> identifierExpression, T item) where T : class
{
var error = string.Empty;
context.Set<T>().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))
{