C# 从代码而不是数据库分配实体id,同时分配两个请求
嘿,我想把一些表示树结构类型的对象放入数据库: 每个TreeNode元素必须具有唯一的id 我的树节点C# 从代码而不是数据库分配实体id,同时分配两个请求,c#,asp.net,.net,sql-server,asp.net-core,C#,Asp.net,.net,Sql Server,Asp.net Core,嘿,我想把一些表示树结构类型的对象放入数据库: 每个TreeNode元素必须具有唯一的id 我的树节点 public class TreeNode { public int Id { get; set; } public int ParentId { get; set; } } 我从应用程序前端接收到的数据 { "name": "Tree Node 1", "children": [{ "name": "Tree Node 2",
public class TreeNode
{
public int Id { get; set; }
public int ParentId { get; set; }
}
我从应用程序前端接收到的数据
{
"name": "Tree Node 1",
"children":
[{
"name": "Tree Node 2",
"children":
[{
"name": "Tree Node 3",
"children":
[{
"name": "Tree Node 4",
"children":
[{
"name": "Tree Node 5",
"children":
[{
"name": "Tree Node 6",
"children": [],
"data":
{
}
}]
},
{
"name" : "Tree Node embeded parent 4",
"children": [],
"data":
{
}
}]
}]
}]
}]
}
我的问题是-如何为每个节点分配正确的Id
我目前的解决方案是,从数据库中获取最后一个插入的Id,并使用它分配给concreate TreeObject。它很管用,但我觉得还不够好
这个解决方案至少有一个很大的缺点——如果两个用户试图同时将数据推送到数据库中怎么办
假设用户A单击了“保存”按钮。
TreeProcessor从数据库接收到100是最后插入Id的信息。
在TreeProcessor以处理数据(例如分配ID)结束后,
数据已准备好发送到数据库,但网络连接突然变慢
同时,用户B也单击了“保存”,但使用了另一个数据。
由于用户A的数据尚未到达数据库,数据库发送了100作为最后插入的id…..您可以在数据库表中使用标识列,并让数据库处理分配id的操作吗?创建一个插入并返回所用标识的过程,然后沿着树往下走
或者,将操作包装在事务中,以便用户B在用户a写入数据之前无法获取id。Google TransactionScope了解如何在C#中实现这一点,或者如果可能的话在数据库中实现这一点(无法从这个问题中完全看出您的总体架构) 能否在数据库表中使用标识列,并让数据库处理分配ID的操作?创建一个插入并返回所用标识的过程,然后沿着树往下走
或者,将操作包装在事务中,以便用户B在用户a写入数据之前无法获取id。Google TransactionScope了解如何在C#中实现这一点,或者如果可能的话在数据库中实现这一点(无法从这个问题中完全看出您的总体架构) 对键使用Guid,
public Guid Id{get;set;}
。对键使用Guid,public Guid Id{get;set;}
。