0

我遇到了一种奇怪的行为,我真的不知道如何解决它。我试图在插入实体后(在 ExecuteDynamicInsert 之后)读取一个实体,当部分方法返回时,我总是得到一个 System.Data.Linq.DuplicateKeyException “数据库生成了一个已经在使用的密钥。 ”。

这是我试图通过一个非常简单的示例实现的目标:

数据上下文文件 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。

有没有办法实现这一点或解决这种行为?

提前致谢。

4

4 回答 4

0

当您使用ExecuteDynamic[Insert|Update|Delete]覆盖默认行为时,不应调用SubmitChangesExecuteDynamic[...]立即在 DataContext 外部实现更改。您收到异常是因为您在调用SubmitChanges时尝试再次应用更改。

于 2010-01-03T18:29:20.853 回答
0

我以前也发生过类似的事情。尝试从 DataContext 设计器中删除 Country 实体并重新添加它。

于 2009-10-23T13:15:46.583 回答
0

我也有同样的例外。在我的实例中,我使用的是 instance.ExecuteDynamicUpdate 而不是 ExecuteDynamicInsert 但我认为这并不重要。

似乎重要的是,如果您在插入/更新中对对象层次结构中的对象进行更改,则会创建此错误。对我来说,乐观并发似乎比重复键更重要,但是嘿,我不在微软工作......

我通过在我的基础业务对象中创建一个新方法来解决我的问题,该方法在对象的数据上下文中调用 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。

于 2010-08-26T14:51:07.223 回答
0

我有一个类似的问题。就我而言,我已经用存储过程覆盖了默认的 INSERT,但忘记设置主键。因此,每当我插入对象时,我都会收到重复键错误,因为它们都以零主键返回。

于 2012-02-09T00:37:57.723 回答