gpt4 book ai didi

c# - 自动递增数字的最佳实践 EF Core

转载 作者:行者123 更新时间:2023-12-05 02:07:07 24 4
gpt4 key购买 nike

我正在寻找最佳实践,以便使用 EF Core 在我的数据库中增加一些数字。

我有一个名为 PARENT 的数据库模型。在我的应用程序中,我可以有多个 PARENTS。每个 parent 都有几个 child 。

parent 1: child 1 - child 2

parent 2: child 1 - child 2 - child 3

我希望在每个 PARENT 中,每个子级都按一列递增编号:int Number。这意味着,

parent 1. child 1 = 001;

parent 1. child 2 = 002;

parent 2. child 1 = 001;

PARENT2.CHILD2 = 002;

...

所以,它必须是唯一的并且由父级增加..

谁能给我一些最佳实践,以便以有效的方式实现这一目标?

更新:

public class Bar {
public Guid BarId {get;set;}
public ICollection<Client> Clients {get;set;}
}

public class Client {
public Guid ClientId {get;set;}
public Guid BarId {get;set;}
public int ClientNumber {get;set;}
}

public class Context : DBContext {
entity.HasKey(e => new { e.BarId, e.ClientId }).HasName("PK_CLIENT");
entity.Property(e => e.ClientId).ValueGeneratedWhenDefault();
entity.Property(e => e.ClientNumber).ValueGeneratedOnAdd();
entity.HasIndex(e => new {e.BarId, e.ClientNumber}).IsUnique()
.HasName("IX_CLIENT_NUMBER");
}

通过调用 ValueGeneratedOnAdd() 我使数字列递增,但我希望它为每个 Bar 递增,因此它应该允许不同 bar 之间的重复客户编号,但不能在同一个 Bar 中,并且还通过 Bar 增加它们,而不仅仅是通过 Client 实体。

最佳答案

一种方法是执行以下操作;

1) 使用整数作为键,并将 ClientNumber 属性设置为可为空。

    public class Bar
{
public int BarId { get; set; }
public ICollection<Client> Clients { get; set; }
}

public class Client
{
public int ClientId { get; set; }
public Bar Bar { get; set; }
public int BarId { get; set; }
public int? ClientNumber { get; set; }
}

2) 将ClientId设置为身份(自动递增),将ClientNumber设置为数据库生成的(否则EF Core插入后不会从数据库中重新读取值)

entity.Property(e => e.ClientId).ValueGeneratedOnAdd();
entity.Property(e => e.ClientNumber).ValueGeneratedOnAddOrUpdate();

3) 添加触发器修改插入后的ClientNumber

    create trigger ClientNumber on Clients after insert 
as
begin
set nocount on;
update c set ClientNumber = n.RowNum from Clients c
inner join (
select ClientId, ROW_NUMBER() OVER(PARTITION BY BarId ORDER BY ClientId ASC) as RowNum
from Clients
) n on n.ClientId = c.ClientId
where c.ClientId in (select ClientId from inserted)
end

现在一切都在插入时自动运行:

            var bar1 = new Bar() { Clients = new List<Client>() };
var bar2 = new Bar() { Clients = new List<Client>() };

bar1.Clients.Add(new Client());
bar1.Clients.Add(new Client());

bar2.Clients.Add(new Client());
bar2.Clients.Add(new Client());

context.Bars.AddRange(new[] { bar1, bar2 });
await context.SaveChangesAsync();

bar1.Clients.Add(new Client());
bar2.Clients.Add(new Client());
bar1.Clients.Add(new Client());
await context.SaveChangesAsync();

将呈现

ClientId    BarId   ClientNumber
1 1 1
2 1 2
6 1 3
7 1 4
3 2 1
4 2 2
5 2 3

缺点是您不能使用唯一索引 IX_CLIENT_NUMBER,因为在触发器执行之前 ClientNumber 将为 NULL。

关于c# - 自动递增数字的最佳实践 EF Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62149328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com