【发布时间】:2016-02-26 11:18:22
【问题描述】:
当表没有主键时如何在表中添加行。
【问题讨论】:
当表没有主键时如何在表中添加行。
【问题讨论】:
正如您的问题标题所述,LINQ to SQL 无法对没有主键的表执行创建、更新或删除操作。这是不可能的。
因此,您可能需要使用 DataContext.ExecuteCommand() 来执行这些操作,或者更好的是重构您的数据库,以便表具有主键。
【讨论】:
我也遇到了同样的问题。但是我解决了这个问题......
1.在服务器资源管理器中设置表的主键(可以在打开的表定义中右键查看)
2.打开App_Code文件夹下的dataclasses.dbml
3.删除已经存在的表
4.再次设置primarykey后拖动同一张表。
5.保存所有更改。(系统会提示将更改保存到.dbml文件-->点击yes)
6.再次运行应用程序
会有用的
【讨论】:
让我用一个例子来说明:
SampleDataContextDataContext db = new SampleDataContextDataContext();
Employee emp = new Employee() {
FirstName = "Experts",
Lastname = "Comment",
Address = "rs.emenu@gmail.com"
};
db.Employees.InsertOnSubmit(emp);
db.SubmitChanges();
上面的代码在尝试插入新行时给出了同样的错误。此问题背后的原因是 LINQ 不提供将数据插入到没有主键的表中的功能。此时您有两个选项可用于执行插入操作。
1.创建一个存储过程并从LINQ调用它。
SampleDataContextDataContext db = new SampleDataContextDataContext();
db.InsertEmployeeData("Experts","Comment", "rs.emenu@gmail.com");
这里我创建了一个名为InsertEmployeeData 的存储过程,并从代码中调用它。简单直接。
2.创建插入语句并使用LINQ执行。
SampleDataContextDataContext db = new SampleDataContextDataContext();
string insertStatement = "Insert into Employee values('Experts', 'Comment','rs.emenu@gmail.com')";
db.ExecuteQuery<Employee>(insertStatement);
这里我创建了一个普通的插入查询并使用 LINQ ExecuteQuery 方法执行。
【讨论】:
如果无法在db中设置,请在linq2sql设计器中设置主键。
如果没有可用作主键的列子集,则将它们全部标记为主键的一部分。
【讨论】:
【讨论】:
这里我可能错了,因为我现在无法验证,但我相信你可以告诉 Linq to Sql 一个字段是主键,即使它实际上不是数据库中的一个。这假设该字段中的数据实际上是唯一的,即使它没有定义为一个,也可以用作键。
如果表没有主键,但包含可以用作键的唯一数据,则在 dbml 中告诉 L2S 这是主键。
如果表不包含可以用作键的唯一数据,那么你必须编写一个存储过程来删除你要删除的数据。
【讨论】:
有些表(如供应商提供的表)没有主键!
每个答案都说“添加主键”。
看,我不会问我是否可以添加一个。条件不是我预设的。
有没有办法只写。无需阅读、删除或更新。
【讨论】: