Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为MVC EF 4.0中检查重复项的泛型方法传递lambda表达式的参数_C#_Entity Framework_Generics_Model View Controller_Lambda - Fatal编程技术网

C# 如何为MVC EF 4.0中检查重复项的泛型方法传递lambda表达式的参数

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

我的应用程序中有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.");
            }
        }
在整个项目中,每个设置都使用几乎相同的代码。 我想使这个方法通用,这样我就可以在需要检查重复项的任何地方调用它。 为此,我必须将参数传递给将设置“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 method
IsExists
更糟糕的了。第二,与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))
{