我是Entity Framework和Code First Migration的新手,所以我希望这是一个容易回答的问题。我试图在ApplicationUser(来自ASP.NET身份)和Member之间创建一对一的关系。我有一个会员班:
public class Member
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual Address Address { get; set; }
public UserStatus Status { get; set; }
public DateTime CreateDate { get; set; }
public virtual string ApplicationUserID { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
}
和ApplicationUserClass:
public class ApplicationUser : IdentityUser
{
public ApplicationUser()
{
}
public virtual Member Member { get; set; }
}
在我的DBContext(继承IdentityDbContext)中,我有以下配置:
modelBuilder.Entity<ApplicationUser>()
.HasOptional(t => t.Member).WithOptionalPrincipal();
base.OnModelCreating(modelBuilder);
当我第一次运行代码时,我得到了这个:
CreateTable(
"dbo.Members",
c => new
{
ID = c.Int(nullable: false, identity: true),
FirstName = c.String(),
LastName = c.String(),
Status = c.Int(nullable: false),
CreateDate = c.DateTime(nullable: false),
ApplicationUserID = c.String(maxLength: 128),
Address_ID = c.Int(),
ApplicationUser_Id = c.String(maxLength: 128),
})
.PrimaryKey(t => t.ID)
.ForeignKey("dbo.Addresses", t => t.Address_ID)
.ForeignKey("dbo.AspNetUsers", t => t.ApplicationUser_Id)
.ForeignKey("dbo.AspNetUsers", t => t.ApplicationUserID)
.Index(t => t.ApplicationUserID)
.Index(t => t.Address_ID)
.Index(t => t.ApplicationUser_Id);
请注意,我有2个外键, ApplicationUserID 和 ApplicationUser_Id 。我想尝试使用FluentAPI(即不是数据注释)来做所有事情。我如何配置它以便EF使用ApplicationUserID,我的班级中的字符串ID?我认为Class + ID是惯例,为什么它会创建另一个外键?
答案 0 :(得分:2)
我相信您应该以这种方式更新配置:
modelBuilder.Entity<Member>()
.HasOptional(x => x.ApplicationUser)
.WithMany()
.HasForeignKey(x => x.ApplicationUserID);
这是EntityFramework处理一对一关系的方式,您必须以这种方式映射并在数据库表中引入UNIQUE
约束。
有关此案例的更多信息,请访问:http://weblogs.asp.net/manavi/associations-in-ef-code-first-ctp5-part-3-one-to-one-foreign-key-associations
以下是链接中的引用:
原因很简单:Code First(和一般的EF)本身并不存在 支持一对一的外键关联。事实上,EF没有 支持任何涉及唯一约束的关联场景 所有。幸运的是,在这种情况下,我们并不关心目标方面的内容 该协会,所以我们可以像对待一个协会一样对待它 没有很多部分。我们想要的只是表达“这个实体(用户) 具有一个属性,该属性是对另一个实体的实例的引用 (地址)“并使用外键字段来表示该关系。 基本上EF仍然认为这种关系是多对一的。这个 是当前EF限制的解决方法,它有两个 后果:首先,EF不会为我们创造任何额外的约束 要以一对一的方式强制执行此关系,我们需要手动执行 自己创造。这种缺乏支持的第二个限制 强加给我们更重要的是:一对一的外国关键协会 不能是双向的(即我们无法定义用户属性) 地址类)。