实体框架:编写一个通用的方法来检查是否存在

本文关键字:方法 存在 是否 检查 一个 框架 实体 | 更新日期: 2023-09-27 18:17:10

我的域类:

public class Address
{
    [Key]
    public virtual string AddressId { get; set; }
    public virtual string Address { get; set; }
}

在我的MVC控制器我想检查给定的地址存在,之前我插入。

public ActionResult Create(Address address)
{
   if (ModelState.IsValid)
   {
      if (db.Addresses.Any(a => a.AddressId == address.AddressId)) // how I do it now
      {
         ModelState.AddModelError(string.Empty, "Address Id already exists!");
      }
      else
      {
         db.Addresses.Add(address);
         db.SaveChanges();
         return RedirectToAction("Index");
      }
   }
}

但是在我的项目中有很多其他的域类,我想一次又一次地做同样的检查。

我的问题是我想在我的Db上下文类中编写一个泛型方法来执行此检查。(看起来像下面或类似)

public bool Exists(object) {
    // return true if exist
}

。我可以像这样调用这个方法:

db.Exists(address)

谢谢!

实体框架:编写一个通用的方法来检查是否存在

您可以使用泛型并做如下操作:

public class YourDbContext : DbContext
{
    ...
    public bool Exists<TEntity>(object id)
        where TEntity : class
    {
        var dbSet = Set<TEntity>();
        var entity = dbSet.Find(id);
        return entity != null;
    }

你可以这样使用:

db.Exists<Address>(address.AddressId);

使用Find并不是最有效的方法来处理这个问题,但它有一个关键的好处,那就是您不需要知道类的实际主键属性是什么,这将使这个方法变得非常复杂。例如,AddressAddressId,但Foo可能有FooId

由于最终这只是在底层使用Find,因此您只需要稍微修改该方法以能够接受多个参数。Find通过允许传递多个参数来处理组合键。但是请记住,顺序很重要,并且必须与您在配置实体时指定的键顺序保持一致。

public bool Exists<TEntity>(params object[] keys)
    where TEntity : class
{
    var dbSet = Set<TEntity>();
    var entity = dbSet.Find(keys);
    return entity != null;
}