1

我无法将相关行插入到我的数据库中。当我在 ASP.NET 应用程序中将新对象插入数据库时​​,我收到外键冲突错误,而在控制台应用程序中,我没有。

以下是重现问题的步骤:

  1. 在新数据库上创建并运行以下 T-SQL 脚本:

    create table dbo.[Groups] (
        GroupId int identity primary key,
        Name nvarchar(64) not null
    )
    
    create table dbo.[Objects] (
        ObjectId int identity primary key,
        GroupId int not null foreign key references [Groups] on delete cascade,
        Name nvarchar(64) not null
    )
    
  2. 设置一个名为“ConsoleProgram”的 C# 控制台应用程序。

  3. 将一个名为“dsObjects”的新数据集添加到项目中。
  4. 将表“组”和“对象”从服务器资源管理器拖到设计器中。
  5. 编辑两个表之间的关系,将关系设置为“关系和外键约束”,更新规则为“级联”。
  6. 将以下代码插入“Main”:

    // (assuming appropriate using statement for dsObjectsTableAdapters)
    var ds = new dsObjects();
    var mgr = new dsObjectsTableAdapters.TableAdapterManager {
        GroupsTableAdapter = new GroupsTableAdapter(),
        ObjectsTableAdapter = new ObjectsTableAdapter()
    };            
    mgr.GroupsTableAdapter.Fill( ds.Groups );
    mgr.ObjectsTableAdapter.Fill( ds.Objects );
    
    var row = ds.Groups.AddGroupsRow( "Fruits" );
    ds.Objects.AddObjectsRow( row, "Apple" );
    ds.Objects.AddObjectsRow( row, "Banana" );
    ds.Objects.AddObjectsRow( row, "Orange" );
    
    mgr.UpdateAll( ds );
    
  7. 运行程序并验证新行是否已插入到相应的表中:

    GroupId     Name
    ----------- -------
    1           Fruits
    
    (1 row(s) affected)
    
    ObjectId    GroupId     Name
    ----------- ----------- -------
    1           1           Apple
    2           1           Banana
    3           1           Orange
    
    (3 row(s) affected)
    
  8. 删除新创建的数据。

  9. 关闭解决方案。
  10. 创建一个新的 ASP.NET Web 应用程序。
  11. 重复步骤 3-5。
  12. 将第 6 步中的代码插入到 Default.aspx 的 Page_Load 函数中。
  13. 运行程序。
  14. 请注意有关外键违规的异常(如果有)。
  15. 再次运行控制台程序,注意数据已成功创建。
  16. 重新创建数据库并再次运行 ASP.NET 应用程序并注意相同的异常。

我尝试使用 UpdateAll 方法按顺序更新表,两个项目的结果相同。

我完全不知道为什么这会在 ConsoleApplication 中工作,而不是在 ASP.NET 应用程序中工作。有任何想法吗?

4

2 回答 2

2

好的,经过一番搜索,我找到了解决问题的方法。在线程http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataset/thread/4d10fe87-2de8-42a8-8ef9-b9d46c0fd28d中,暗示为了正确更新身份列数据集,必须在 INSERT 语句之后使用 SELECT 语句。在探索了“TableAdapter 配置向导”之后,我发现在“高级选项”下有一个“刷新数据表”选项,它在 INSERTions 之后添加了适当的 SELECT 语句。由于某些未知的原因,这在 ASP.NET Web 应用程序中默认未选中,而在控制台应用程序中默认选中。

选中此选项后,数据集更新将按预期工作。

于 2012-07-17T17:16:14.907 回答
1

我在我的 PC 上运行您的代码,但在我的控制台应用程序中出现以下错误。

Cannot make this change because constraints are enforced on relation FK__Objects__GroupId__2C3393D0, and changing this value will strand child rows.

还有一件事,var row = ds.Groups.AddGroupsRow( "Fruits" );当我调试它时,以下代码返回一个包含 GroupID 和 Name 的数据行,我发现在添加第一条记录后它包含 GroupID = -1 和 Name = Fruits。ID 怎么可能是 = -1 ?

于 2012-07-17T09:46:51.060 回答