代码优先迁移中的额外外键

时间:2015-12-17 17:28:07

标签: c# .net entity-framework ef-code-first

我是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是惯例,为什么它会创建另一个外键?

1 个答案:

答案 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不会为我们创造任何额外的约束   要以一对一的方式强制执行此关系,我们需要手动执行   自己创造。这种缺乏支持的第二个限制   强加给我们更重要的是:一对一的外国关键协会   不能是双向的(即我们无法定义用户属性)   地址类)。