我正在经历一种奇怪的行为,我真的不知道如何解决它。我正在尝试在插入实体后立即读取它(在ExecuteDynamicInsert之后),当部分方法返回时,我总是得到一个System.Data.Linq.DuplicateKeyException“数据库生成了一个已经在使用的密钥。 ”
以下是我想用一个非常简单的例子来实现的目标:
DataContext文件MyDataContext.cs:
public partial class MyDataContext
{
public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
{
//using (TransactionScope ts = new TransactionScope())
//{
base.SubmitChanges(failureMode);
//}
}
partial void InsertCountry(Country instance)
{
this.ExecuteDynamicInsert(instance);
Country country = this.Countries.Where(c => c.CountryID == instance.CountryID).Single();
} //Exception occurs when this method returns...
}
程序文件Program.cs:
class Program
{
static void Main(string[] args)
{
using (MyDataContext dataContext = new MyDataContext())
{
Country c = new Country()
{
Code = "C",
CreatedBy = "Me",
CreatedDate = DateTime.Now,
ModifiedBy = "Me",
ModifiedDate = DateTime.Now
};
dataContext.Countries.InsertOnSubmit(c);
dataContext.SubmitChanges();
}
}
}
如果我在插入后没有阅读国家/地区,代码工作正常,但我需要阅读它,无论出于何种原因,我不想使用ChangeSet。
有没有办法实现这一目标或解决此问题?
提前致谢。
答案 0 :(得分:0)
我之前发生过这样的事情。尝试从DataContext设计器中删除Country实体并重新添加它。
答案 1 :(得分:0)
使用 ExecuteDynamic [Insert | Update | Delete] 覆盖默认行为时,不应调用 SubmitChanges 。 ExecuteDynamic [...] 直接在DataContext外部实现更改。您收到异常是因为您在调用 SubmitChanges 时尝试再次应用更改。
答案 2 :(得分:0)
我有同样的例外。在我的实例中,我使用的是instance.ExecuteDynamicUpdate而不是ExecuteDynamicInsert,但我认为这并不重要。
似乎重要的是,如果您对inset / update中的对象层次结构中的对象进行了更改,则会创建此错误。对我来说,似乎更多的是乐观并发而不是重复键,但是嘿,我不在微软工作......
我通过在我的基础业务对象中创建一个新方法来解决我的问题,该方法在对象的数据上下文中调用SubmitChanges,然后然后进行了所需的任何更改。
在您的情况下,您可以尝试向Country对象添加一个名为Commit的方法,如下所示:
public sub Commit(dc as MyDataContext)
dc.SubmitChanges()
Dim country as Country = dc.Countries.Where(function (c) c.CountryID = Me.CountryID).Single()
end sub
然后在Main中调用c.Commit而不是datacontext.SubmitChanges。
答案 3 :(得分:0)
我有类似的问题。在我的例子中,我用存储过程覆盖了默认的INSERT,但忘了设置主键。所以,每当我插入对象时,我都会得到一个重复的键错误,因为它们都是以零键为主键返回。