Entity Framework Core:使用自动生成的外键作为复合主键的一部分

范围

我有一个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; }
}

此外,我有两个类IntClassand FloatClass,它们都包含一个时间序列,但类型不同。为了获取 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因为在这种情况下,属性不是按数组顺序获取的)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JPA如何使复合外键成为复合主键的一部分

使用Entity Framework Core在部分主键上自动递增

将鉴别符列添加为Entity Framework中唯一索引的一部分

如何使用Entity Framework Core获得主键值

在Code-First Entity Framework中的复合主键中包含外键

在Entity Framework Core中使用[ComplexType]

如何使用Entity Framework 6将单个属性映射为多个复合外键的一部分?

使用Entity Framework Core迁移更改主键

Entity Framework Core仍然使用旧列

在Entity Framework Core中使用迁移

当一个实体具有复合主键时,Entity Framework Core中的多对多关系

始终在Entity Framework Core支持中加密

如何使用Entity Framework查询外键对象?

使用Entity Framework Core共享表

使用Entity Framework Core获取多个表

使用Entity Framework Core存储计算的属性

如何在Entity Framework Core的复合键中使用常量配置关系?

将数据插入表中作为主键外键的一部分-Entity Framework

使用Entity Framework Core编写计算成员

Entity Framework Core中的动态查询执行

将组合键与Entity Framework Core一起使用,并将其中一部分用作外键

可以在同一项目中使用Entity Framework和Entity Framework Core吗?

无效的列名Entity Framework Core

如何将对象模型的一部分映射到Entity Framework和SQL Server中的XML列?

在EntityObject的扩展部分内的Entity Framework SaveChanges

webforms中的数据控件是Entity Framework的一部分吗?

Entity Framework Core 中的 SqlGeometry

Entity Framework core 2.0 Functions 如何工作

如何在 Entity Framework Core 中定义外键