1

TLDR 总结

我在使用 ASP.net MVC 的 InsertOnSubmit() 函数时遇到了一些问题。如何在不遇到关键约束的情况下构建新对象并将其插入数据库?

重现步骤

我已经继续并创建了一个简单的演示,展示了我遇到的 3 个左右的主要问题,也许有人可以在这里帮助我。

  1. 创建一个新的 ASP.net MVC 2 项目。
  2. 创建两个表 - 具有一对多关系的实验和结果(如下所示)。
  3. 在 Home 控制器中创建一个名为“RunExperiment”的新操作。
  4. 创建一个基本的 linq-to-sql 数据上下文。
  5. 让 RunExperiment 生成一个新的实验和结果,并通过新的数据上下文将它们插入到数据库中。

这个过程很快就崩溃了,因为需要发生一些魔法来防止重复的主键确保依赖关系保持不变。

数据库设置的示例图像。

现在看看我的示例“RunExperiment”函数:

    public ActionResult RunExperiment(string Title, string Scientist)
    {
        RepositoryDataContext RDC = new RepositoryDataContext();

        // Generate the experiment
        Experiment thisExperiment = new Experiment();
        thisExperiment.experimentTitle = Title;
        thisExperiment.experimentScientist = Scientist;

        // Perform some work.
        System.Threading.Thread.Sleep(500);

        // Attempt to insert the experiment.  
        // Works once, fails subsequently due to duplicate primary key.
        RDC.Experiments.InsertOnSubmit(thisExperiment);
        RDC.SubmitChanges();

        for (int i = 0; i < 5; i++)
        {
            Result thisResult = new Result();
            thisResult.resultDate = DateTime.Now;
            thisResult.resultTemp = i;
            thisResult.Experiment = thisExperiment;

            RDC.Results.InsertOnSubmit(thisResult);
            RDC.SubmitChanges();
        }            

        return View("Index");
    }

有什么想法吗?我知道这是基本的东西,但我正在努力避免仅仅复制 Nerd Dinner 模式,但我遇到了这些错误。

谢谢!

4

3 回答 3

2

您能否确认您experimentId在 SQL Server 中的列设置 - 我相信这应该设置为:

[experimentId] [int] IDENTITY(1,1) NOT NULL

删除后,我能够重现您的错误IDENTITY

在 LINQ to SQL 中,列的属性应该Int NOT NULL IDENTITY在“服务器数据类型”属性中

于 2011-06-06T23:06:57.403 回答
2

首先,你要解决我最讨厌的一个问题——不要处理你的连接。

然后,利用 LINQ 自动为您执行外键关联。调用一次 SubmitChanges() 以提交所有内容。

public ActionResult RunExperiment(string Title, string Scientist)
{
    using (RepositoryDataContext RDC = new RepositoryDataContext())
    {
        // Generate the experiment
        Experiment thisExperiment = new Experiment();
        thisExperiment.experimentTitle = Title;
        thisExperiment.experimentScientist = Scientist;

        // Perform some work.
        System.Threading.Thread.Sleep(500);

        for (int i = 0; i < 5; i++)
        {
            Result thisResult = new Result();
            thisResult.resultDate = DateTime.Now;
            thisResult.resultTemp = i;

            // LINQ will automatically wire up the association during the insert
            thisExperiment.Results.Add(thisResult);
        }

        // Attempt to insert the experiment, with associated results
        RDC.Experiments.InsertOnSubmit(thisExperiment);
        RDC.SubmitChanges();
    }

    return View("Index");
}

顺便说一句,其中的数据访问部分(您正在努力解决的所有问题)是 LINQ to SQL,而不是特定于 ASP.NET MVC。您不必将 LINQ to SQL 与 MVC 一起使用,也不必将 MVC 与 LINQ to SQL 一起使用。

于 2011-06-06T23:27:02.660 回答
1

每次都尝试再次插入thisExperiment,你可以反过来做,将结果添加到实验的结果属性中吗?

或者,只指定experimentID 而不是链接它们?

于 2011-06-06T22:39:20.897 回答