流利的API实体框架核心



用户可以拥有1或0个帐户

public class User
    {
        public int UserId { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public Account Account { get; set; }
    }
    public class Account
    {
        public int AccountId { get; set; }         
        public DateTime CreatedDateTime { get; set; }
        public User User { get; set; }
    }

这是使用实体框架6

的流利API代码
public class ClassDbContext: DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
                  .HasOptional(s => s.Account) 
                  .WithRequired(ad => ad.User);
    }
    public DbSet<User> Users { get; set; }
    public DbSet<Account> Accounts { get; set; }
}

这是结果结果

使用实体框架核心的等效流利API代码是什么?

@tseng已接近,但还不够。使用建议的配置,您将获得消息,并获得消息:

无法确定" account.user"one_answers" user.account"之间检测到的一对一关系的孩子/依赖方面。要识别关系的儿童/依赖方面,请配置外国密钥属性。有关更多详细信息,请参见http://go.microsoft.com/fwlink/?linkid=724062。

基本上是在文档中从链接中解释的。

首先,您需要使用HasOneWithOne

第二,您必须使用 HasForeignKey指定两个实体中的哪一个是依赖(当一个在一个中没有单独的FK属性时,无法自动检测到它实体(。

第三,不再需要所需的依赖IsRequired方法可用于指定当依赖实体使用单独的fk时(而不是PK,即在您的情况下,即使用所谓的共享主键关联,因为PK显然显然是PK不能为null(。

话虽如此,张贴模型的正确F核心流利配置如下:

modelBuilder.Entity<User>()
    .HasOne(e => e.Account)
    .WithOne(e => e.User)
    .HasForeignKey<Account>(e => e.AccountId);

的结果是:

migrationBuilder.CreateTable(
    name: "User",
    columns: table => new
    {
        UserId = table.Column<int>(nullable: false)
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
        Email = table.Column<string>(nullable: true),
        Name = table.Column<string>(nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_User", x => x.UserId);
    });
migrationBuilder.CreateTable(
    name: "Account",
    columns: table => new
    {
        AccountId = table.Column<int>(nullable: false),
        CreatedDateTime = table.Column<DateTime>(nullable: false)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Account", x => x.AccountId);
        table.ForeignKey(
            name: "FK_Account_User_AccountId",
            column: x => x.AccountId,
            principalTable: "User",
            principalColumn: "UserId",
            onDelete: ReferentialAction.Cascade);
    });

与其他名称几乎相同。

modelBuilder.Entity<User>()
    .HasOne(s => s.Account) 
    .WithOne(ad => ad.User)
    .IsRequired(false);

最新更新