如何将主键移至EF Core 5中的基本表

阿杰特
public interface IEntity<TId> 
{
    TId Id { get; set; }
}
    
public abstract class Auditable
{
    public int CreatedBy { get; set; }
    public User CreatedUser { get; set; } = null!;
    
    public DateTime Created { get; set; }
    
    public int LastModifiedBy { get; set; }
    public User ModifiedUser { get; set; } = null!;
    
    public DateTime? LastModified { get; set; }
}

public class AccountStatus : Auditable, IEntity<int>
{
    public int Id { get; set; }
    public string Name { get; set; } = null!;
    public string? Code { get; set; }
    public string? Description { get; set; }
}

public class AccountType : Auditable, IEntity<long>
{ 
   public long Id { get; set; }  ...
}

我正在为现有的Implemetation添加可审核的基本实体..当我从Audtable实体继承时,出现错误

无法在“ AccountStatus”上配置密钥,因为它是派生类型。必须在根类型“可审核”上配置密钥。如果您不打算在模型中包含“可审核”,请确保您的上下文中的DbSet属性未引用它,在ModelBuilder的配置调用中未引用它,或在包含在其中的类型的导航中未引用它该模型。

对于其他实体,密钥可以是int / long。

我无法将key(Id)移至基类,因为其他实体的键可能是int / long。如何在EF Core 5中实现这一目标?编辑:

 public class AuditableMap : IEntityTypeConfiguration<Auditable>
    {
        public void Configure(EntityTypeBuilder<Auditable> builder)
        {
         
            builder.Property(t => t.Created).HasColumnType("timestamp without time zone");
            builder.Property(t => t.LastModified).HasColumnType("timestamp without time zone");
            builder.HasOne(t => t.CreatedUser).WithMany().HasForeignKey(t => t.CreatedBy).OnDelete(DeleteBehavior.Restrict);
            builder.HasOne(t => t.ModifiedUser).WithMany().HasForeignKey(t => t.LastModifiedBy).OnDelete(DeleteBehavior.Restrict);


        }
    }


 public class AccountStatusMap : IEntityTypeConfiguration<AccountStatus>
    {
        public void Configure(EntityTypeBuilder<AccountStatus> builder)
        {
            builder.ToTable("account_status", schema: "public");
            builder.HasKey(t =>t.Id);
            builder.Property(t =>t.Name).HasMaxLength(100);
            builder.Property(t => t.Code).HasMaxLength(10);
            builder.Property(t =>t.Description).HasMaxLength(200);
         

        }
    }
一月

如果Auditable没有逻辑,而只是一个简单的数据类,则可以将其更改为接口:

public interface IAuditable
{
    int CreatedBy { get; set; }
    User CreatedUser { get; set; }; //I removed the null! here if need be, you might consider using Nullable-Types
    
    DateTime Created { get; set; }
    
    int LastModifiedBy { get; set; }
    User ModifiedUser { get; set; };
    
    DateTime? LastModified { get; set; }
}

public class AccountStatus : IAuditable, IEntity<int>
{
    public int Id { get; set; }
    public string Name { get; set; } = null!;
    public string? Code { get; set; }
    public string? Description { get; set; }

    public int CreatedBy { get; set; }
    public User CreatedUser { get; set; } = null!;
    
    public DateTime Created { get; set; }
    
    public int LastModifiedBy { get; set; }
    public User ModifiedUser { get; set; } = null!;
    
    public DateTime? LastModified { get; set; }
}

public class AccountType : IAuditable, IEntity<long>
{ 
public long Id { get; set; }  ...
//add all fields from the interface IAuditable here as well
}

由于您必须在每个派生类中键入这些字段,因此增加了更多的仪式,但是许多IDE支持为实现的接口自动生成代码。

如果您有许多需要实现此接口的类,但是具有不同的ID数据类型,则可以这样创建基类:

public class AuditableIdInt: IAuditable 
{
    public int Id { get; set; }
    // all fields from the Interface
}

public class AuditableIdLong: IAuditable 
{
    public long Id { get; set; }
    // all fields from the Interface
}

您甚至可能会考虑泛型基类,其中泛型定义了ID类型。但我不确定这是否适用于EF。

PS:我怀疑AccountType是否需要一个长ID。检查整数类型列表

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将 EF Core 安装到 VS Code 中?

来自分类Dev

如何将表参数传递给 EF Core 中的 SQL Server 存储过程?

来自分类Dev

如何在EF Core中获取数据库表主键列的列表

来自分类Dev

如何将 EF Core 中相关集合中的属性的 IsModified 设置为 false?

来自分类Dev

如何将ThenInclude实现到EF Core自定义规范中?

来自分类Dev

EF Core 3.0中所有表共有的基本实体

来自分类Dev

如何使用EF Core将单个主键更改为复合主键

来自分类Dev

EF Core 5如何停止将ValueGeneratedOnAdd添加到我的所有模型中

来自分类Dev

在intelliJ中,如何将方法移至接口的实现类?

来自分类Dev

如何将博客中的子域移至wordpress?

来自分类Dev

在 EF Core 2.1.1 中配置交集表

来自分类Dev

如何将日志从Asp Net Core WebApi存储到Azure表存储中?

来自分类Dev

如何将新列添加到 Identity RoleClaims 表中(asp net core)

来自分类Dev

如何将Web服务中的数据与Core Data同步?

来自分类Dev

如何将ID添加到Postgresql中的主键?

来自分类Dev

EF Core 在类库中并从 API 项目中使用 - 如何将配置信息传递给类库?

来自分类Dev

如何将主键值插入另一个表的主键?

来自分类Dev

EF Core中的IsNumeric

来自分类Dev

如何移至.Net Core 3.1中的UI线程?

来自分类Dev

如何使EF-Core的ID /主键使用Guid而不是String

来自分类Dev

Xunit - 如何使用 Moq 和 EF Core 作为身份主键

来自分类Dev

更改生成的联接表的名称(多对多)-EF Core 5

来自分类Dev

更改生成的联接表的名称(多对多)-EF Core 5

来自分类Dev

如何在 Entity Framework Core 中创建没有主键的表?

来自分类Dev

.NET Core中的主键继承

来自分类Dev

将复合表映射到 EF Core 中的默认值表

来自分类Dev

删除具有相同主键的行后如何将数据插入表中?

来自分类Dev

如何将数据加载到使用 GUID 主键的数据表中?

来自分类Dev

带总和的EF Core 5

Related 相关文章

  1. 1

    如何将 EF Core 安装到 VS Code 中?

  2. 2

    如何将表参数传递给 EF Core 中的 SQL Server 存储过程?

  3. 3

    如何在EF Core中获取数据库表主键列的列表

  4. 4

    如何将 EF Core 中相关集合中的属性的 IsModified 设置为 false?

  5. 5

    如何将ThenInclude实现到EF Core自定义规范中?

  6. 6

    EF Core 3.0中所有表共有的基本实体

  7. 7

    如何使用EF Core将单个主键更改为复合主键

  8. 8

    EF Core 5如何停止将ValueGeneratedOnAdd添加到我的所有模型中

  9. 9

    在intelliJ中,如何将方法移至接口的实现类?

  10. 10

    如何将博客中的子域移至wordpress?

  11. 11

    在 EF Core 2.1.1 中配置交集表

  12. 12

    如何将日志从Asp Net Core WebApi存储到Azure表存储中?

  13. 13

    如何将新列添加到 Identity RoleClaims 表中(asp net core)

  14. 14

    如何将Web服务中的数据与Core Data同步?

  15. 15

    如何将ID添加到Postgresql中的主键?

  16. 16

    EF Core 在类库中并从 API 项目中使用 - 如何将配置信息传递给类库?

  17. 17

    如何将主键值插入另一个表的主键?

  18. 18

    EF Core中的IsNumeric

  19. 19

    如何移至.Net Core 3.1中的UI线程?

  20. 20

    如何使EF-Core的ID /主键使用Guid而不是String

  21. 21

    Xunit - 如何使用 Moq 和 EF Core 作为身份主键

  22. 22

    更改生成的联接表的名称(多对多)-EF Core 5

  23. 23

    更改生成的联接表的名称(多对多)-EF Core 5

  24. 24

    如何在 Entity Framework Core 中创建没有主键的表?

  25. 25

    .NET Core中的主键继承

  26. 26

    将复合表映射到 EF Core 中的默认值表

  27. 27

    删除具有相同主键的行后如何将数据插入表中?

  28. 28

    如何将数据加载到使用 GUID 主键的数据表中?

  29. 29

    带总和的EF Core 5

热门标签

归档