首先在EntityFramework代码中的一对一关系-设置关系的列名称
本文关键字:关系 设置 一对一 EntityFramework 代码 | 更新日期: 2023-09-27 18:12:56
我创建了以下实体。
[Table("User")]
public class User
{
[...]
[Key]
public String ID { get; set; }
[Column("CreatedBy")]
public virtual User CreatedBy { get; set; }
}
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasRequired(a => a.CreatedBy)
.WithRequiredPrincipal();
}
创建表时,CreatedBy的列名是"User_ID",尽管我使用了Column属性。栏名应该是"CreatedBy"
我把上面的代码行改为 modelBuilder.Entity<User>().HasRequired(a => a.CreatedBy)
.WithRequiredPrincipal().Map(e => e.MapKey("CreatedBy"))
并在包管理器中添加了一个带有add-migration的新迁移。在Update-Database上,我得到消息:'DALDbContext中的实体。用户参与"User_CreatedBy"关系。找到0个相关的User_CreatedBy_Source。1 User_CreatedBy_Source
我的表是空的。有人知道解决这个问题的方法吗?
不确定是什么导致了你的确切问题。然而,我可能只会坚持基于属性的配置或基于流畅api的配置。在这两种情况下,最好的做法是同时包含导航属性和外键。采用这种方法既好又干净,可能会解决您的问题。
基于属性的
public class User
{
[Key]
public string Id { get; set; }
[Column("CreatedBy")]
public int? CreatedByUserId { get; set; }
[ForeignKey("CreatedByUserId")]
public virtual User CreatedBy { get; set; }
}
基于Fluent api的
public class User
{
public string Id { get; set; }
public int? CreatedByUserId { get; set; }
public virtual User CreatedBy { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// add in configuration for table name, pk, etc
modelBuilder.Entity<User>()
.Property(p => p.CreatedByUserId)
.HasColumnName("CreatedBy");
modelBuilder.Entity<User>()
.HasOptional(x => x.CreatedBy)
.WithMany()
.HasForeignKey(x => x.CreatedByUserId);
}