我有两个LINQ to SQL类,CandyBar和DeliciousCandyBar,它们映射到SQL Server中相同名称的表。
CandyBar和DeliciousCandyBar之间存在0..1关系。即,一个CandyBar可以有0或1个DeliciousCandyBars。相反,DeliciousCandyBar恰好有一个CandyBar。
在LINQ to SQL类中,它们(基本上)看起来像
class CandyBar {
public int Id { get;set;} // this is primary key w/ autoincrement identity
public string Name {get;set;}
public EntityRef<DeliciousCandyBar> DeliciousCandyBar {get;set;}
}
class DeliciousCandyBar {
public int DeliciousnessFactor {get;set;}
public int CandyBarId {get;set;} // FK to candyBar Id
public EntityRef<CandyBar> CandyBar {get;set;} // the association property of the FK
}
为了馈送数据库(通过l2sql),我的搜寻器出去了,找到了糖果棒和美味的糖果棒。
但是,随着我的搜寻器将第一个美味的糖果棒插入CandyStoreDataContext中,在调用SubmitChanges时,DataContext引发异常。
搜寻器为一个美味的糖果棒运行以下代码。请注意,这是一个示例。确切的过程更加复杂,我使用了一个自定义DSL搜寻器,它会吐出该对象结构。本质上,执行以下操作。
var dc = CandyStoreDataContext();
var bar = new CandyBar() {
Name = "Flake",
DeliciousCandyBar = new DeliciousCandyBar() {
DeliciousnessFactory = 12
}
};
dc.CandyBars.InsertOnSubmit(bar);
dc.SubmitChanges();
在SubmitChanges()上,引发SqlException消息“ INSERT语句与FOREIGN KEY约束FK_CandyBar_DeliciousCandyBar发生冲突。冲突发生在数据库CandyStoreData的表'dbo.DeliciousCandyBar'的列'CandyBarId'中。
当我将CandyStoreDataContext.Log转储到Console.Out时,问题变得很明显,生成的插入语句是错误的处理方式。 LINQ to SQL试图首先插入DeliciousCandyBar(试图在CandyBarId列中设置无效值),而不是首先插入CandyBar。
我的问题是,如何使Linq to SQL与插入语句的顺序交换?
我曾经(错误地假设)LINQ to SQL会知道关系依赖的方向,反之亦然。
更新:
This post建议我以错误的方式对待协会。但这对我来说没有意义。在数据库中建模时,这很有意义。反过来怎么办呢?
在CandyBar上,DelciousCandyBar属性的association属性为
[Association(Name =“ DeliciousCandyBar_CandyBar”,Storage =“ _ DeliciousCandyBar”,ThisKey =“ Id”,OtherKey =“ CandyBarId”,IsForeignKey = true)]
在DeliciousCandyBar上,CandyBar属性的association属性为
[Association(Name =“ DeliciousCandyBar_CandyBar”,Storage =“ _ CandyBar”,ThisKey =“ CandyBarId”,OtherKey =“ Id”,IsUnique = true,IsForeignKey = false)]
好的,现在我很困惑,为什么第二个属性标记为外键。
我将尝试在SQL Management Studio中重新创建CandyBar和DeliciousCandyBar之间的关系
更新2
好的,我尝试过两种方式创建关系。而且SSMS可以非常清楚地知道主键的位置(CandyBar.Id)。我第一次做对了。否则,级联将倒退。
最佳答案
我会考虑它是带有自引用表的linq2sql错误的可能性。这是一个疯狂的猜测,但是我记得linq2sql文档说在某个地方它不能很好地支持它。也许那里的linq2sql设计器感到困惑。
从您发布的生成的属性中,您可以知道它是向后的,即CandyBar指向的是美味,而不是相反。查看生成的代码,以了解其他正常运行的关系。
一旦您确认它不起作用,并且通过在设计器中重新添加它们不能正确设置它们,请在设计器中打开工作关联的属性,并确保已在设计器中配置了candybar和Deliciouscandy之间的关联。同样的方式。