2010-09-14 42 views
3

我是一位有DAO和SQL Server的noob,当我尝试插入时遇到问题值分成两个有关系的表。表Photos具有gpsId字段,该字段与GPSLocations表的id字段具有外键关系。我想创建链接到一个新的GPSLocation新照片的条目,所以代码看起来是这样的:尝试进行分层更新会导致错误“无法插入外键值”

gpsRow = dataset.GPSLocations.AddGPSLocationsRow("0.0N", "3.2W"); 
dataset.Photos.AddPhotosRow(@"c:\path\file.jpg", gpsRow); 
tableAdapterManager.UpdateAll(dataset); 

然而这会导致以下错误:

A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = photoToGps ]

我使用SQL Server CE。我的理解是正确的,TableAdapterManager应该处理这个分层更新?我只是将这些表拖到XSD视图上,并依靠其自动创建包装类。我是否需要改变关系的任何内容(例如使其成为外键约束)?我注意到,在某些情况下,gps编号是正面的,有时是负面的,是相关的吗?

编辑: 我也确保更新属性设置为CASCADE,这会导致相同的错误。分层更新设置为true,设计器中的两个表之间存在外键约束。

+0

也许我们需要更多信息。我假设GPSLocations表中的第三个字段是id字段并被标记为主键。有没有理由不是身份领域?为什么照片没有id字段(可能与您的问题无关,我只是想更多地了解该模式)。 – 2010-09-22 04:40:30

+0

对不起,第三个字段是误导性的,所以我删除了它,它只是一个数据成员,而不是一个身份。 GPSLocations表有一个标识列'id'(也是主键),它与'Photos'表的'gpsId'列有关系 – 2010-09-22 21:08:56

回答

2

我已经设法追查到这个问题的根源,归结为与完整的SQL Server相比SQL Server CE的局限性。事实证明,有些事情不对的主要暗示是因为IDs是负面的。在行插入到数据库之前,DataSet中的id为负数,此时它将被解析为正数索引。事实上,它没有成为一个积极的指数发生,因为TableAdapterManager通常会执行一个批次声明INSERT后跟一个SELECT更新id。但是,SQL Server CE不支持批处理语句,因此需要编写额外的代码,以便通过响应RowUpdated事件来模拟SELECT步骤。这个MSDN article解释了步骤。

+0

有趣。我不知道在LINQ To SQL和Entity Framework中是否存在相同的问题,它们是Microsoft自己的DataSets替代品。 – 2010-09-28 06:37:02

0

由于列photoToGps(外键)取决于主键(id),因此除非存在相应的ID,否则无法添加photoToGps。所以你需要的是个人更新,而不是做一个UpdateAll。首先更新GPSLocations表格,然后更新另一个表格。这样,在为其添加photoToGPS之前,您将拥有一个ID。

+0

谢谢,但是我在尝试TableAdapterManager之前曾尝试过,我认为这应该是假设的处理这种更新的地方有一个关系,这意味着必须先更新一个表。 – 2010-09-20 11:28:02

1

您是否按照here所述启用了分层更新?

+0

谢谢,我会试试 – 2010-09-21 13:12:02

+0

是的,它已被设置为真 - 这是VS2008中的默认设置 – 2010-09-21 21:42:21

1

这两个表之间是否存在外键约束(在连接它们的XSD设计器上应该有一行)?由于您的字段命名不同,因此在将表格拖动到设计图面时可能未自动添加。

+0

是的,存在外键约束。我已经尝试了XSD设计器中的不同选项来启用约束或关系。我得到相同的结果。 – 2010-09-21 13:12:54

3

这只是您的数据集的配置。双击Visual Studio的数据集设计器中的表格之间的关系,选择关系和外部关键约束选项和在更新规则字段选择级联选项和那必须是它。

关于此主题的一些信息在MSDN中,您可以在这里查看http://msdn.microsoft.com/en-us/library/bb629317.aspx并转到相关主题。

+0

正如我在对ktharsis的回应中所提及的那样,在我的编辑中,我已经启用了外键约束,并且更新规则被设置为级联。 – 2010-09-24 13:17:22

+2

你说在那里你尝试了不同的选择,但我不知道你已经尝试过这个。只是“Foreigh Key Constraint”不起作用。必须确切地将“关系和外部关键约束”都与更新规则“级联”结合在一起。我刚刚尝试过,它工作。也许这是因为你使用的是SQL Server CE,而我正在使用MS SQL 2008 Developer Edition。 – 2010-09-24 13:25:58

+0

我现在发现,这是SQL Server CE和完整的SQL Server之间的区别 - 请参阅我自己的回答 – 2010-09-27 21:27:48