如何在保存对数据库的更改时检查现有实体?

时间:2013-03-03 16:00:25

标签: asp.net-mvc entity-framework

我正在寻找一种在创建新数据库之前检查数据库中现有条目的方法。

我有一个非常简单的表Person,它有两个值RowIdUserId。这些值不是同一个值,UserId是来自外部服务的值,可能是任何值,RowId是我系统中的唯一标识符。

当保存和模型具有Person的对象作为外来对象时,我想使用UserId填充对象,并在保存对象时检查具有{{1}的记录存在,如果存在,则使用那个而不是创建一个新的。

我曾想过在UserId中覆盖SaveChanges()方法,但不确定是否可以在此处完成。

有没有人对我如何解决这个问题有任何想法,或者我会更好地实现登录我的控制器?

我想我会展示我目前是如何做到把它放到上下文中的:

控制器:

DbContext

在此public MvcHtmlString UpdatePanelDetails(int id, FormCollection values) { Panel panel = db.Panels.Find(id); bool worked = TryUpdateModel(panel,values); if (ModelState.IsValid) { db.Entry(panel).State = System.Data.EntityState.Modified; db.SaveChanges(); return new MvcHtmlString("Success"); } else { return new MvcHtmlString("Failed"); } } 模型中,我有Panel个对象。在我的视图中,我查找了外部人员系统,该系统填充了绑定到Person的隐藏文本框,因此当Person.UserId TryUpdateModel绑定到Person时但是Panel为0.

我想要的是能够拥有一个可以填充正确RowId的位置(如果此人已经存在),这就是为什么我正在考虑覆盖RowId方法。

我现在认为这是不可能的,而且我会更好地将其作为人员查询的一部分并且有两个隐藏的文本框。

1 个答案:

答案 0 :(得分:0)

我认为RowIdUserIdPerson表的复合主键。这意味着,由于唯一约束,尝试保存已存在的条目会引发Exception。您可以处理此异常并使用该值,因为它不会保存为重复条目。

try
{
    DbContext.SaveChanges();
}
catch (Exception ex)
{
    // If the unique constraint is violated you end up here.
}

为了不处理Exception,您可以执行以下操作:

var person = DbContext.Persons.Where(p => p.UserId == userId).SingleOrDefault();
if (person == null)
{
    DbContext.Persons.Add(new Person(userId));
    DbContext.SaveChanges();
}