【发布时间】:2010-04-14 10:10:09
【问题描述】:
我在名为 Users 的数据库中有一个表
用户 ------ ID(PK,身份) 用户名(唯一索引)我在用户名表上设置了一个唯一索引以防止重复。然后我枚举一个集合并在数据库中为每个项目创建一个新用户。
我想要做的只是插入一个新用户并在违反唯一键约束时忽略异常(因为在这种情况下它显然是重复记录)。这是为了避免必须制作where not exists类型的查询。
首先,这会更有效还是我的插入代码应该检查重复项?我更喜欢具有该逻辑的数据库,因为这可以防止任何其他类型的客户端插入重复数据。
我的另一个问题与 LINQ To SQL 有关。我有以下代码:
public class TestRepo
{
DatabaseDataContext database = new DatabaseDataContext();
public void Add(string username)
{
database.Users.InsertOnSubmit(new User() { Username = username });
}
public void Save()
{
database.SubmitChanges();
}
}
然后我遍历一个集合并插入新用户,忽略任何异常:
TestRepo repo = new TestRepo();
foreach (var name in new string[] { "Tim", "Bob", "John" })
{
try
{
repo.Add(name);
repo.Save();
}
catch { }
}
这是第一次运行,太好了,我的表中有三个用户。如果我删除第二个并再次运行此代码,则不会插入任何内容。我希望第一次插入失败并出现异常,第二次成功(因为我刚刚从数据库中删除了该项目),第三次失败。
似乎正在发生的是,一旦抛出 SqlException(即使循环继续迭代),所有下一个插入都会失败 - 即使表中没有会导致唯一违规的行。
谁能解释一下?
附:我能找到的唯一解决方法是每次在插入之前实例化 repo,然后它完全按照例外情况工作 - 表明它与 LINQ To SQL DataContext 有关。
谢谢。
【问题讨论】:
-
我在写之前的帖子时误读了你的代码,所以我的回答完全错误,这就是我删除它的原因。
标签: c# sql-server linq-to-sql caching