我需要一对一(可选)。
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关系的唯一方法。
希望有帮助!