我正在寻找一种在创建新数据库之前检查数据库中现有条目的方法。
我有一个非常简单的表Person
,它有两个值RowId
和UserId
。这些值不是同一个值,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
方法。
我现在认为这是不可能的,而且我会更好地将其作为人员查询的一部分并且有两个隐藏的文本框。
答案 0 :(得分:0)
我认为RowId
和UserId
是Person
表的复合主键。这意味着,由于唯一约束,尝试保存已存在的条目会引发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();
}