gpt4 book ai didi

c# - Entity Framework 核心 : use auto-generated foreign key as part of composite primary key

转载 作者:行者123 更新时间:2023-12-01 23:28:27 26 4
gpt4 key购买 nike

我有一个通用类 TimeSeries<T>其中包含通用状态变量列表 State<T> . State<T>包含某个时间的状态。

public class TimeSeries<T>
{
[Key]
public int ID { get; set; }
public List<State<T>> States { get; set; }
}

public class State<T>
{
[Key]
public int StateID { get; set; }
public DateTime Date { get; set; }
public T State { get; set; }
}

此外,我有两个类IntClassFloatClass ,两者都包含时间序列,但类型不同。获取 TimeSeries 的两个表,其中一个表的外键指向 IntClass另一个有一个指向 FloatClass 的外键,我从 TimeSeries<T> 派生了另外两个类,每个都包含一个外键属性。

public class IntTimeSeries : TimeSeries<int>
{
public int IntClassID{ get; set; }
}
public class FloatTimeSeries : TimeSeries<float>
{
public int FloatClassID{ get; set; }
}

IntClassFloatClass包含派生类的实例:

public class IntClass
{
[Key]
public int ID { get; set; }
public IntTimeSeries TimeSeries { get; set; }
}
public class FloatClass
{
[Key]
public int ID { get; set; }
public FloatTimeSeries TimeSeries { get; set; }
}

此方法会生成表格 State<int>State<float> .这些具有(自动生成的)外键 IntClassIDFloatClassID , 分别。如果我注释 StateID[Key]正如我在这里所做的那样,那当然是主键。

然而,我想要的是主键是复合 (Date, IntClassID)(Date, FloatClassID) , 分别。我需要这个,因为有时我需要从我只有读取权限的第二个数据库更新值。这可能吗?

最佳答案

在 EF-core 3 和 5 中,您可以通过修改 EF 的元数据来实现此目的,这些元数据在这些更高版本中很容易访问:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var stateTypes = modelBuilder.Model.GetEntityTypes()
.Where(e => e.ClrType.IsConstructedGenericType
&& e.ClrType.GetGenericTypeDefinition() == (typeof(State<>)))
.ToList();
stateTypes
.ForEach(t => t.SetPrimaryKey(t.FindProperties(new[] { "StateID", "Date"} )));
}

这首先收集从 State<> 派生的实体类型然后为这些类型设置主键属性。使用 nameof当然会让这在运行时更安全。

对于 EF core 2 用户,最后的语句是:

    stateTypes.ForEach(t => t.SetPrimaryKey(t.GetProperties()
.Where(p => new[] { "StateID", "Date" }.Contains(p.Name))
.OrderByDescending(p => p.Name)
.ToList()));

( OrderByDescending 因为在这种情况下,属性不是按数组的顺序获取的)。

关于c# - Entity Framework 核心 : use auto-generated foreign key as part of composite primary key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66801880/

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