首页 > 解决方案 > 我的数据库实体有一个通用基础 BaseEntity,但是如何将基本实体的 Id 值映射到数据库实体?

问题描述

如何互换使用实体基 ID 或数据库列 ID

public partial class Orders : EntityBase<int>
{
    protected Orders() { }
    public int Orderid { get; set; }
    public override int Id { get => base.Id; set => base.Id = Orderid; }
}

实体库:

public abstract class EntityBase<T> : IEntity<T>
{
    public virtual T Id { get; set; }
}

问题:我能否将 EntityBase 的 Id 和 db 列的主键(例如:订单实体的键 -> orderId)映射到同步值(在应用程序代码中,用户集的基 ID 或实体的 orderId 都应该包含相同的值,并且当检索到这些值时,在给定的时间,应该返回相同的值。有没有办法通过OnModelCreating()方法中的 fluent API 来实现上述同步功能?PS:如果你没有理解问题,请说哪部分没有澄清, 而不是使用权限:)

标签: c#entity-framework-coreef-fluent-api

解决方案


基本上,如果我正确理解了您的问题,您希望有一个带有 Id 的基类,但是在 SQL 中,您以不同的方式命名了您的 Id 列。您想为您的更新设置别名,以便在您设置它们的 Id 时,它们也设置 DB Id。

这更像是一种架构,如果你真的需要,你可以编写帮助你自动搭建脚手架的工具,但这似乎有问题而且更复杂。

相反,我将尝试通过修改您的架构来解决此问题。解决此问题的一种简单方法是使用 Id

public partial class Orders : EntityBase<int>
{
    protected Orders() { }
    [Column("Orderid")]
    public int Id { get; set; }
}

您可以将列直接映射到 Id 属性,并一起避免整个问题。如果您打算同时拥有 OrderId 和 Id

public partial class Orders : EntityBase<int>
{
    protected Orders() { }
    public int Orderid { get; set; }
    public override int Id { get => Orderid; set => Orderid = value; }
}

但是使用该架构通常是一个坏主意,因为您的 EntityBase 是通用的,所以这很混乱,似乎容易出错。


推荐阅读