将内置用户配置文件映射到表中的用户配置文件ID列

时间:2012-10-15 17:24:37

标签: .net asp.net-mvc-3 entity-framework

我有一个带定义的表Tale

public class Tale
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Text { get; set; }
    public DateTime ReleaseDate { get; set; }

    public int enum_TaleAuthorTypeId { get; set; }
    public virtual enum_TaleAuthorType enum_TaleAuthorType { get; set; }

    public int CommentableId { get; set; }
    public virtual Commentable Commentable { get; set; }
}

当我在控制台中输入'update-database'时,我与CommentableId的一列和enum_TaleAuthorTypeId的列有很好的关系。

现在,我想添加UserProfile并尝试输入类似:

的内容
public int UserProfileId { get; set; }
public virtual UserProfile UserProfile { get; set; }

但是在添加迁移之后,我有了这个:

AddColumn("dbo.Tales", "UserProfileId", c => c.Int(nullable: false));
AddColumn("dbo.Tales", "UserProfile_UserId", c => c.Int());

我应该如何只获得一列价值?为什么要创建两列?

1 个答案:

答案 0 :(得分:0)

问题在于,根据惯例,EF希望UserProfile的主键为Id,但您将其设为UserId

您可以将UserId中的UserProfile的属性名称更改为Id,以便EF按惯例推断密钥,或覆盖约定并将UserId保留为主键。

您可以使用属性覆盖约定,例如

[ForeignKey("UserProfileId")]
public virtual UserProfile UserProfile { get; set; }

或使用Fluent API,例如

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Tale>()
                .HasRequired(a => a.UserProfile)
                .WithMany()
                .HasForeignKey(u => u.UserProfileId);

}