我需要一对一(可选)。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<PinnacleAccount>().HasKey(x => x.Id);

    modelBuilder.Entity<PinnacleAccount>()
        .HasRequired(x => x.User)
        .WithOptional(x => x.PinnacleAccount);

    base.OnModelCreating(modelBuilder);
}

当我运行“add migration init”时,我会检查生成的迁移并查看:
CreateTable(
                "dbo.PinnacleAccounts",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        ClientId = c.String(),
                        Password = c.String(),
                        PercentForBet = c.Int(nullable: false),
                        UserId = c.String(),
                        User_Id = c.String(nullable: false, maxLength: 128),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.AspNetUsers", t => t.User_Id)
                .Index(t => t.User_Id);

但我有属性userid。为什么EF创建用户ID
   public class ApplicationUser : IdentityUser
    {
        public virtual PinnacleAccount PinnacleAccount { get; set; }
        public int? PinnacleAccountId { get; set; }

        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }
    }

最佳答案

在实体框架中建立1:0.1关系时,第一个实体的主键必须与第二个实体的主键相同。不能指定哪个属性是FK,因为它不是必需的。我会解释:
如果User只有一个PinnacleAccount,则为1:0.1关系。因此,每个PinnacleAccount都属于一个User。这意味着,PinnacleAccount是一个弱实体,所以它的主键也是一个User外键。
PinnacleAccount不应该有自己的id,而应该只有用户id。所以,PinnacleAccount应该是这样的:

public class PinnacleAccount
{
    public string UserId { get; set; } //PK AND FK
    public string ClientId  { get; set; }
    public string Password { get; set; }
    public string PercentForBet { get; set; }
}

映射:
modelBuilder.Entity<PinnacleAccount>().HasKey(x => x.UserId);
modelBuilder.Entity<User>()
    .HasOptional(i => i.PinnacleAccount)
    .WithRequired(x => x.User);

这是建立1:0.1关系的唯一方法。
希望有帮助!

10-04 12:18