我该怎么办?我不想使用Entity Framework在数据库中添加相同的记录

问题描述 投票:-1回答:1

我可以使用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();
            }
        }
}
c# entity-framework
1个回答
0
投票

鉴于您的范围,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);
...

这可能有助于重用性和范围方面的考虑。

© www.soinside.com 2019 - 2024. All rights reserved.