1

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

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

保存和建模具有 aPerson作为外来对象的对象时,我想使用 填充对象,UserId并且在保存对象时,检查是否存在具有该对象的记录,如果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绑定PersonPanel但有一个RowId0 时。

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

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

4

1 回答 1

0

我会假设它是您表RowId的复合主键。这意味着尝试保存已经存在的条目会因为唯一约束而引发一个。您可以处理此异常并使用该值,因为它不会保存为重复条目。UserIdPersonException

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();
}
于 2013-03-03T16:05:52.257 回答