Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从代码而不是数据库分配实体id,同时分配两个请求_C#_Asp.net_.net_Sql Server_Asp.net Core - Fatal编程技术网

C# 从代码而不是数据库分配实体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",

嘿,我想把一些表示树结构类型的对象放入数据库:

每个TreeNode元素必须具有唯一的id

我的树节点

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;}