LINQ to SQL:调用“SubmitChanges”时读取实体会导致DuplicateKeyException

时间:2009-10-22 22:30:04

标签: linq-to-sql override partial submitchanges insertonsubmit

我正在经历一种奇怪的行为,我真的不知道如何解决它。我正在尝试在插入实体后立即读取它(在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。

有没有办法实现这一目标或解决此问题?

提前致谢。

4 个答案:

答案 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,但忘了设置主键。所以,每当我插入对象时,我都会得到一个重复的键错误,因为它们都是以零键为主键返回。