实体框架代码优先 - 使用Memberships / Users表的User Id键作为自定义表中的外键

时间:2012-09-03 17:47:38

标签: asp.net-mvc-4 entity-framework-5

我正在尝试创建一个SQL表来包含其他用户信息。 我希望它由VS2012中的迁移(package console => update-database)创建。

我看到有两个表使用UserId列作为键:Memberships and Users tables.

我正在尝试定义以下类并通过Migrator将其映射到SQL表:

    [Key]
    [Column(Order = 0)]
    [ForeignKey("User")]
    public Guid **UserId** { get; set; }

    [Key]
    [Column(Order = 1)]
    [ForeignKey("Category")]
    public int CategoryId { get; set; }

    public virtual Category Category { get; set; }
    **public virtual User User { get; set; }**

虽然在User SQL表中很明显UserId列是键,但是我收到以下错误消息:

\tSystem.Data.Entity.Edm.EdmEntityType: : EntityType 'User' has no key defined. Define the key for this EntityType.
\tSystem.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'Users' is based on type 'User' that has no keys defined.

我在这里缺少什么?可能是Microsoft.VisualBasic.ApplicationServices.User / System.Web.Security.MembershipUser类不一定以这种方式映射到表,反之亦然,因此UserId属性未声明为Key dataannotation?

我愿意接受其他解决此问题的方案。

非常感谢!

1 个答案:

答案 0 :(得分:0)

我目前正在使用asp.net mvc4和Azure db。

当我想在UserProfile的其他表中使用UserId时。请注意,在AccountModels中有类UserProfile:

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
}

现在,假设您的类别是由特定用户创建的,您可以通过以下方式将类别条目链接到用户。

[Table("Category")]
public class Category
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int CategoryId { get; set; }
    public UserProfile CreatorUserId { get; set; }
}

否则,您始终可以将UserProfile用作模型。