流利的Api實體框架核心

c# ef-fluent-api entity-framework entity-framework-core

用戶可以擁有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; }

    }

這是使用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; }
}

這是ResultImage的結果

什麼是使用Entity Framework Core的等效流暢api代碼?

一般承認的答案

@Tseng很接近,但還不夠。使用建議的配置,您將獲得帶有消息的異常:

無法確定在“Account.User”和“User.Account”之間檢測到的一對一關係的子/從屬方。要標識關係的子/依賴方,請配置外鍵屬性。有關詳細信息,請參閱http://go.microsoft.com/fwlink/?LinkId=724062

它基本上在鏈接的文檔中進行了解釋。

首先,您需要使用HasOneWithOne

其次, 必須使用HasForeignKey指定兩個實體中的哪一個是從屬實體(當其中一個實體中沒有定義單獨的FK屬性時,無法自動檢測到它)。

第三,沒有必要的依賴 。當依賴實體使用單獨的FK(而不是您的情況下的PK,即使用所謂的共享主鍵關聯,因為PK顯然不能為空)時, IsRequired方法可用於指定是否需要FK。

話雖如此,發布模型的正確F Core流暢配置如下:

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);


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow