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
设置为有效的唯一值。如果此表具有多对多关系,您将需要由UserId
和WorkUserId
组成的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)?