EF Core 2.0:数据库优先转代码优先时WorkUser类自增列与主键映射问题
解决方案
要实现你的需求(WorkUserId作为自增属性,UserId作为来自其他表的非自增主键),你需要调整数据注解的使用方式,同时确保UserId正确关联到目标表的外键。以下是正确的实现代码:
public class WorkUser { // 标记为数据库自增列,插入时无需手动赋值 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int WorkUserId { get; set; } // 非自增主键,同时作为关联User表的外键 [Key] [ForeignKey(nameof(User))] // 关联到对应的User实体类 public int UserId { get; set; } // 可选:添加导航属性,支持EF Core的关联查询功能 public User User { get; set; } }
关键细节说明:
WorkUserId自增配置:[DatabaseGenerated(DatabaseGeneratedOption.Identity)]注解会告诉EF Core,这个字段的值由数据库自动生成(比如SQL Server的IDENTITY(1,1)列),插入数据时不需要手动提供该值。UserId作为非自增主键:[Key]标记它为当前表的主键,[ForeignKey(nameof(User))]指定它是关联User表的外键。因为是主键且非自增,插入WorkUser数据时必须手动传入有效的UserId(该值必须存在于User表中)。
额外补充(针对EF Core 2.0):
如果你是从现有数据库转换到代码优先,需要确保数据库中WorkUserId确实被设置为自增约束,同时UserId是主键且已建立外键关联到User表。如果是全新生成数据库,EF Core会根据你的注解自动创建对应的列和约束。
如果你原本想设置复合主键(WorkUserId和UserId共同作为主键),可以这样写:
public class WorkUser { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Key, Column(Order = 0)] public int WorkUserId { get; set; } [Key, Column(Order = 1)] [ForeignKey(nameof(User))] public int UserId { get; set; } public User User { get; set; } }
这种情况下,两个字段共同组成主键,WorkUserId依然保持自增特性,UserId作为外键且非自增,插入时需手动提供UserId值。
内容的提问来源于stack exchange,提问作者Mukil Deepthi
相关产品推荐
相关产品推荐

