流利的Api实体框架核心

m.o*_*men 5 c# entity-framework entity-framework-core ef-fluent-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; }

    }
Run Code Online (Sandbox Code Playgroud)

这是使用Entity Framework 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; }
}
Run Code Online (Sandbox Code Playgroud)

这是结果ResultImage

使用Entity Framework Core等效的流畅api代码是什么?

Iva*_*oev 6

@Tseng很近,但还不够。使用建议的配置,您将获得异常消息:

对于在'Account.User'和'User.Account'之间检测到的一对一关系,无法确定子方/从属方。要标识关系的子级/从属端,请配置外键属性。有关更多详细信息,请参见http://go.microsoft.com/fwlink/?LinkId=724062

链接的文档中对此进行了基本解释。

首先,您需要使用HasOneWithOne

其次,您必须用于HasForeignKey指定两个实体中的哪一个是从属的(当其中一个实体中没有定义单独的FK属性时,无法自动检测到该实体)。

第三,不再需要依赖。该IsRequired方法可用于指定当从属实体使用单独的FK时是否需要FK(而不是如您所愿的PK,即所谓的“ 共享主键关联”,因为PK显然不能为空)。

话虽如此,发布模型的正确F Core流利配置如下:

modelBuilder.Entity<User>()
    .HasOne(e => e.Account)
    .WithOne(e => e.User)
    .HasForeignKey<Account>(e => e.AccountId);
Run Code Online (Sandbox Code Playgroud)

结果是:

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);
    });
Run Code Online (Sandbox Code Playgroud)