实体框架:编写一个通用的方法来检查是否存在
本文关键字:方法 存在 是否 检查 一个 框架 实体 | 更新日期: 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
并不是最有效的方法来处理这个问题,但它有一个关键的好处,那就是您不需要知道类的实际主键属性是什么,这将使这个方法变得非常复杂。例如,Address
有AddressId
,但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;
}