Fluent Api Entity Framework core

后端 未结 2 1142
终归单人心
终归单人心 2021-01-12 15:01

A user can have 1 or 0 account

public class User
    {
        public int UserId { get; set; }
        public string Name { get; set; }
        public string         


        
相关标签:
2条回答
  • 2021-01-12 15:41

    Pretty much the same, with other names.

    modelBuilder.Entity<User>()
        .HasOne(s => s.Account) 
        .WithOne(ad => ad.User)
        .IsRequired(false);
    
    0 讨论(0)
  • 2021-01-12 15:43

    @Tseng is close, but not enough. With the proposed configuration you'll get exception with message:

    The child/dependent side could not be determined for the one-to-one relationship that was detected between 'Account.User' and 'User.Account'. To identify the child/dependent side of the relationship, configure the foreign key property. See http://go.microsoft.com/fwlink/?LinkId=724062 for more details.

    It's basically explained in the documentation from the link.

    First, you need to use HasOne and WithOne.

    Second, you must use HasForeignKey to specify which one of the two entities is the dependent (it cannot be detected automatically when there is no separate FK property defined in one of the entities).

    Third, there is no more required dependent. The IsRequired method can be used to specify if the FK is required or not when the dependent entity uses separate FK (rather than PK as in your case, i.e. with the so called Shared Primary Key Association because PK apparently cannot be null).

    With that being said, the correct F Core fluent configuration of the posted model is as follows:

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

    and the result is:

    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);
        });
    
    0 讨论(0)
提交回复
热议问题