我可以使用Find,FirstOrDefault,Any等任何方法。
public virtual void Add(T entity)
{
using (MovieAppContext _context = new MovieAppContext())
{
var record = _context.Set<T>().Find(entity); // does not work I got e
if (record == null)
{
_context.Set<T>().Add(entity);
_context.SaveChanges();
}
}
}
鉴于您的范围,DbSet<T>.Find<T>(params object[])
可能不是您应使用的方法。
以下解决方案使用IQueryable<T>.Any<T>(Expression<Func<T, bool>>)
,这是接受谓词\函数的Linq扩展方法。
using (MovieAppContext _context = new MovieAppContext())
{
bool queryResult = _context.Set<T>().Any((e) => e.Name.Equals(entity.Name, StringComparison.OrdinalIgnoreCase));
if (queryResult)
{
_context.Set<T>().Add(entity);
_context.SaveChanges();
}
}
[这里,我们定义了一个匿名函数委托Func<T, bool>
,而该委托又被用于定义一个Linq表达式Expression<Func<T, bool>>
。
我定义了此函数谓词表达式以评估实体名称(此类型的组合属性;在此示例中描绘了唯一约束。)
此外,使用匿名函数的替代方法是声明一个表达式并将其传递。
...
Expression<Func<T, bool>> WhereEntityNameMatches = (e) => e.Name.Equals(entity.Name, StringComparison.OrdinalIgnoreCase));
bool queryResult = _context.Set<T>().Any(WhereEntityNameMatches);
...
这可能有助于重用性和范围方面的考虑。