【问题标题】:Linq 2 SQL: composite primary keyLinq 2 SQL:复合主键
【发布时间】:2015-03-15 18:07:53
【问题描述】:

我有一个带有两个外键的链接表。它们一起是表的主键。我正在尝试在 Linq 中映射它:

[Table(Name = "PartToPart")]
public class PartToPart
{
    [Column(Name = "PartID", IsPrimaryKey = true )]
    public int PartID { get; set; }

    [Column(Name = "ParentPartID", IsPrimaryKey = true)]
    public int ParentPartID { get; set; }
}

我假设这是错误的,让 Linq 假设两列都是主键?如果我尝试将新条目保存到此表中,我会收到约束冲突错误:

违反主键约束...无法在对象 dbo.PartToPart 中插入重复键。重复的键值是...

我尝试通过 INSERT 查询手动插入键,效果很好,所以我假设我的表设置正确。奇怪的是,无论错误消息如何,插入都能正常工作。

我检查了the docs,在我看来它应该按照我的方式工作:

如果您使用此属性指定多个类的成员,则称该键是相关列的组合。

对此有任何帮助吗? 谢谢。

【问题讨论】:

  • 带有[Table]属性,应该是LINQ-to-SQL吧?
  • 代码是正确的,如果我没记错的话。它们都是由程序手动设置的,还是一个自动增量的?
  • 两者都是外键并在自己的表中自动递增。我写入 PartToPart 表的值是由程序手动完成的。
  • 您的错误可能出在其他地方...也许您正试图插入相同的记录两次或类似的东西。
  • 您要插入什么数据?我通常使用 [Key] 属性(就像这里描述的 msdn.microsoft.com/en-us/data/jj591583.aspx#Composite),但我认为 IsPrimaryKey = true 应该做同样的事情。看起来不错。

标签: c# .net sql-server linq linq-to-sql


【解决方案1】:

你的类定义是正确的。您编写的实体与您所写的完全一样。请注意,如所写,键必须由 C# 代码设置,并且它们不是自动递增字段。你告诉我这是准确的,所以这不是问题。

鉴于错误,我会说您尝试插入两次相同的记录(和/或插入两次“空”记录,然后将 PartIDParentPartID 设置为 0 由 .网络)

【讨论】:

  • 再次感谢。如上所述,我的代码被执行了两次。
猜你喜欢
  • 2014-05-25
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
相关资源
最近更新 更多