如何在 EF Core 2.1 中定义外键关系
How to define foreign key relationship in EF Core 2.1
我正在为我的 DAL 使用 EF Core 2.1。这是我的模型的样子
一个用户只能有一个角色:
// Role entity - kind of master
public class Role
{
public int RoleId { get; set; }
public string RoleName { get; set; }
}
// User entity - every user will have one role
public class User
{
public int UserId { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public int RoleId { get; set; }
public bool IsActive { get; set; }
public DateTime CreatedOn { get; set; }
public virtual Role Role { get; set; }
}
这就是我 thinking/tried 定义这两个实体之间关系的方式:
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(x => x.UserId);
builder.Property(x => x.RoleId).IsRequired(true);
builder.Property(x => x.CreatedOn).IsRequired(true).HasDefaultValue(DateTime.Now);
// FK - throwing compile time error
builder.HasOne(x => x.Role).WithOne(y => y.RoleId);
}
如何使用 EF Fluent 定义这个一用户一角色关系 API?
谢谢。
附件:-
我认为您可以像这样将用户添加到角色
public class Role
{
public int RoleId { get; set; }
public string RoleName { get; set; }
public List<User> Users {get;set;}
}
那么你就这样注册
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(x => x.UserId);
builder.Property(x => x.RoleId).IsRequired(true);
builder.Property(x => x.CreatedOn).IsRequired(true).HasDefaultValue(DateTime.Now);
builder.HasOne(x => x.Role).WithMany(y => y.Users);
}
不仅在 FK 关系配置中,您在 CreatedOn
列的默认值生成配置中也有问题。所以写你的实体配置如下:
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(u => u.UserId);
builder.Property(u => u.CreatedOn).IsRequired(true).HasDefaultValueSql("getdate()");
// FK - configuraiton
builder.HasOne(u => u.Role).WithMany().HasForeignKey(u => u.RoleId).IsRequired(true);
}
Entity framework 的原则之一是 "Convention over configuration",按照惯例,我认为 builder.HasOne(x => x.Role).WithOne(y => y.RoleId);
不是必需的,因为按照惯例您已经声明您的用户实体应该添加 public int RoleId { get; set; }
和 public virtual Role Role { get; set; }
属性时只有一个角色。
删除它,我确信您的应用程序将产生我上面评论中所述的行为。
我正在为我的 DAL 使用 EF Core 2.1。这是我的模型的样子
一个用户只能有一个角色:
// Role entity - kind of master
public class Role
{
public int RoleId { get; set; }
public string RoleName { get; set; }
}
// User entity - every user will have one role
public class User
{
public int UserId { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public int RoleId { get; set; }
public bool IsActive { get; set; }
public DateTime CreatedOn { get; set; }
public virtual Role Role { get; set; }
}
这就是我 thinking/tried 定义这两个实体之间关系的方式:
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(x => x.UserId);
builder.Property(x => x.RoleId).IsRequired(true);
builder.Property(x => x.CreatedOn).IsRequired(true).HasDefaultValue(DateTime.Now);
// FK - throwing compile time error
builder.HasOne(x => x.Role).WithOne(y => y.RoleId);
}
如何使用 EF Fluent 定义这个一用户一角色关系 API?
谢谢。
附件:-
我认为您可以像这样将用户添加到角色
public class Role
{
public int RoleId { get; set; }
public string RoleName { get; set; }
public List<User> Users {get;set;}
}
那么你就这样注册
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(x => x.UserId);
builder.Property(x => x.RoleId).IsRequired(true);
builder.Property(x => x.CreatedOn).IsRequired(true).HasDefaultValue(DateTime.Now);
builder.HasOne(x => x.Role).WithMany(y => y.Users);
}
不仅在 FK 关系配置中,您在 CreatedOn
列的默认值生成配置中也有问题。所以写你的实体配置如下:
public void Configure(EntityTypeBuilder<User> builder)
{
builder.HasKey(u => u.UserId);
builder.Property(u => u.CreatedOn).IsRequired(true).HasDefaultValueSql("getdate()");
// FK - configuraiton
builder.HasOne(u => u.Role).WithMany().HasForeignKey(u => u.RoleId).IsRequired(true);
}
Entity framework 的原则之一是 "Convention over configuration",按照惯例,我认为 builder.HasOne(x => x.Role).WithOne(y => y.RoleId);
不是必需的,因为按照惯例您已经声明您的用户实体应该添加 public int RoleId { get; set; }
和 public virtual Role Role { get; set; }
属性时只有一个角色。
删除它,我确信您的应用程序将产生我上面评论中所述的行为。