【问题标题】:Linq to Sql problemLinq to Sql 问题
【发布时间】:2010-01-07 18:38:29
【问题描述】:

您好:我正在用 C# 自学 Linq to Sql。因为我使用的是 SqlCE 数据库,所以我不得不使用 SqlMetal 来生成 dbml 文件。这很好,我将 dbml 文件添加到我的程序中。我不知道如何为数据库生成一个DataContext,但我可以查询数据库,但不能插入一行。下面是一个不起作用的例子:

Journal 是数据库,Exercise 是数据库中唯一的表。

string con = Properties.Settings.Default.JournalConnectionString;
            Journal db = new Journal(con);

            Exercise ne = new Exercise();

            ne.Date = Convert.ToDateTime("2009-10-25T14:35:00");
            ne.Length = Convert.ToDouble(3.0);
            ne.Elapsed = "00:53:35";

            db.SubmitChanges();

有人可以建议我在插入时做错了什么吗?非常感谢。

【问题讨论】:

  • 我运行了 sqlmetal 命令 /Code: 来为每个 DanThMan 生成数据文件,现在我有可用的 db.Exercise.InsertOnSubmit(ne) 命令,但我收到此错误:错误 2 类型无法从用法中推断方法“System.Data.Linq.Table.InsertAllOnSubmit(System.Collections.Generic.IEnumerable)”的参数。尝试明确指定类型参数。我为我缺乏知识而道歉,但这对我来说是全新的。

标签: c# linq-to-sql sql-server-ce


【解决方案1】:

您忘记将记录添加到表中。

db.Exercises.InsertOnSubmit(ne);

既然你正在学习这个,使用using也是一个好主意

       using(Journal db = new Journal(con))
       {

          Exercise ne = new Exercise();

          ne.Date = Convert.ToDateTime("2009-10-25T14:35:00");
          ne.Length = Convert.ToDouble(3.0);
          ne.Elapsed = "00:53:35";

          db.Exercises.InsertOnSubmit(ne);  //add this line to add rec to table
          db.SubmitChanges();
        }

【讨论】:

  • 我重新编写了 SqlMetal 命令 /dbml 和 /code,它成功了。感谢您的回答,以及使用技巧。
【解决方案2】:

你从未调用过DataContext.InsertOnSubmit

db.Exercises.InsertOnSumbit(ne);
db.SubmitChanges();

如果要插入多个Exercises,请使用DataContext.InsertAllOnSubmit

// exercises is IEnumerable<Exercise>
db.Exercises.InsertAllOnSubmit(exercises);
db.SubmitChanges();

【讨论】:

  • +1 @Jason,我一直忘记他们更改了 Add to InsertOnSubmit
【解决方案3】:

也可以查看PLINQO。它确实为 LINQ to SQL 添加了很多功能,并消除了很多痛点。

http://www.plinqo.com/

【讨论】:

    【解决方案4】:

    你应该添加行

    db.Exercises.InsertOnSubmit(ne);
    

    在进行 SubmitChanges 之前。

    【讨论】:

      【解决方案5】:

      你需要告诉上下文插入你的对象。例如:

      db.Exercises.InsertOnSubmit(ne);
      db.SubmitChanges();
      

      【讨论】:

        【解决方案6】:

        要生成 DataContext,您需要使用 SqlMetal.exe 运行两个不同的命令。

        这是我一直在使用的批处理文件,希望对您有所帮助:

        set tool_path="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sqlmetal"
        set project_root="C:\Documents\...\Solution\Your_Project_Name"
        
        %tool_path% /server:.\SQLEXPRESS /database:Your_Database_Name /dbml:%project_root%\Models\Your_Dbml_Name.dbml
        if errorlevel 1 goto BuildEventFailed
        
        %tool_path% /server:.\SQLEXPRESS /database:Your_Database_Name /language:csharp /namespace:Your_Namespace.Models /code:%project_root%\Models\Your_DataContext_Class_Name.cs
        if errorlevel 1 goto BuildEventFailed
        
        goto BuildEventOK
        
        :BuildEventFailed
        exit 1
        
        :BuildEventOK
        

        您需要修改 .\SQLEXPRESS 以映射到您的数据库服务器。

        插入尝试的问题是您正在创建要插入的对象,但实际上并没有告诉 LinqToSql 插入它。您需要在数据上下文中调用 InsertOnSubmit()

        【讨论】:

        • 我这样做了,但我仍然没有 DataContext。我不知道这是因为 Compact Edition SQL 还是什么。
        猜你喜欢
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 2010-12-01
        相关资源
        最近更新 更多