Entity Framework Core 2.0 自动增量和主键映射

Posted

技术标签:

【中文标题】Entity Framework Core 2.0 自动增量和主键映射【英文标题】:Entity Framework Core 2.0 autoincrement and primary key mapping 【发布时间】:2018-06-19 12:03:00 【问题描述】:

我正在将数据库优先项目转换为代码优先项目。

我有以下课程,我正在使用 EF Core 2.0:

public class WorkUser

    public int WorkUserId  get; set; 

    public int UserId  get; set; 

我尝试了以下,不确定是否正确。

public class WorkUser

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int WorkUserId  get; set; 

    [Key]
    public int UserId  get; set; 

我希望WorkUserId 作为自动增量属性,UserId 作为主键。 UserId 值来自另一个表。所以希望这是主键但没有自动增量。

如何做到这一点?

【问题讨论】:

你真的试过你的代码吗?它会产生什么? 什么是BaseEntity?你有问题吗,如果有,是什么问题?现在,这不是一个真正的问题。 此should work as you expect,但您需要确保将UserId 设置为有效的唯一值。如果此表具有多对多关系,您将需要由UserIdWorkUserId 组成的a composite key(即添加一个Key 属性和一个带有Order 属性的Column 属性.) @Zhaph-BenDuguid 谢谢。这个表不会有多对多的关系。 @DavidG 我已通过删除基础实体进行了更新。 【参考方案1】:

以下按我的预期工作:

public class WorkUser

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int WorkUserId  get; set; 

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int UserId  get; set; 

【讨论】:

【参考方案2】:

试试这个:

public class SampleContext:DBContext
public DbSet<WorkUser> WorkUsers get; set; 

protected override void OnModelCreating(ModelBuilder modelBuilder)
    modelBuilder.Entity<WorkUser>()
        .Property(p => p.WorkUserId )
        .ValueGeneratedOnAdd();
 

【讨论】:

【参考方案3】:

在 EF Core 中,您应该使用序列作为解决方案。

    public class Project
    
      [Key]
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
      public int Id  get; set; 
      public int ProjectId  get; set; 
    

然后配置你的 onModelBuilder:

modelBuilder.HasSequence<int>("ProjectId").StartsAt(100).IncrementsBy(1);
modelBuilder.Entity< Project>().Property(o => o.ProjectId).HasDefaultValueSql("NEXT VALUE FOR ProjectId");

或者您可以在docs 上阅读更多信息。

【讨论】:

以上是关于Entity Framework Core 2.0 自动增量和主键映射的主要内容,如果未能解决你的问题,请参考以下文章

在 Entity Framework Core 2.0 中执行存储过程

与 Entity Framework Core 2.0 的一对零关系

Entity Framework Core 2.0:如何配置一次抽象基类

Entity Framework Core 2.0 Add-Migration 不会创建任何迁移文件

如何告诉 Entity Framework 我的 ID 列是自动递增的(AspNet Core 2.0 + PostgreSQL)?

如何防止 Entity Framework Core 2.0 重命名生成类中的表和列(数据库优先)