我的应用程序中有超过 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 表达式”的通用函数。
我创建了一个静态类,可以从应用程序中的任何位置访问它。
问题是如何将参数传递给此类(包含通用方法),该类将为不同的表和列通用设置 lambda 表达式并显示通用错误消息。
提前致谢。
实体框架已经提供了一种机制来检查数据库中是否存在实体,方法是AddOrUpdate method http://msdn.microsoft.com/en-us/library/dn217945%28v=vs.113%29.aspx。您可以在这样的方法中使用它:
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;
}
在一些静态实用程序类中。
Usage:
var error = Util.AddWhenNew(context, a => a.ABBREVATION, airline);
if (!string.IsNullOrEmpty(error))
{
etc.
我特意检查State != EntityState.Added
因为实体的状态可以是Attached
or Modified
这里(当它有相同的时候修改ABBREVATION
但另一个属性不同)。但实际上,当实体不存在时Added
,其状态被错误地报告为Detached
因为一个bug https://entityframework.codeplex.com/workitem/2128 in AddOrUpdate
.
所以你必须确保只打电话SaveChanges
添加对象后,然后处置上下文,否则您可能会无意中保存其他修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)