实体框架关键问题

时间:2018-06-12 09:02:32

标签: c# entity-framework composite-key

我尝试登录时收到以下错误:

  

Project.Model.Identity.UserLogin :: EntityType' UserLogin'没有定义键。定义此EntityType的键。   UserLogins:EntityType:EntitySet' UserLogins'基于类型' UserLogin'没有定义键。

我正在尝试在dbcontext中使用复合键

  // Primary Key
  this.HasKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId });

但它似乎无法选择它,看起来它正在搜索模型中的键而不是在上下文中,因为当我添加" [Key]"模型中的关键字,它抱怨必须使用HasKey作为复合键

public partial class UserLogin
{
    [Key]
    public string LoginProvider { get; set; }
    [Key]
    public string ProviderKey { get; set; }
    [Key]
    public string UserId { get; set; }
    public virtual User User { get; set; }
}

我如何通过这个?我是否在模型中添加了HasKey,如果是这样,为什么不在上下文中添加它?

2 个答案:

答案 0 :(得分:5)

如文档中所述,

  

当您有复合键时,Entity Framework要求您定义键属性的顺序。您可以使用Column批注指定订单。

尝试修改代码,如下所示:

public partial class UserLogin
{
    [Key]
    [Column(Order=1)]
    public string LoginProvider {get; set;}
    [Key]
    [Column(Order=2)]
    public string ProviderKey {get; set; }
    // and so on...
}

答案 1 :(得分:3)

尝试在[Key]属性

下添加列顺序数据注释
[Key]
[Column(Order=1)]
public string LoginProvider { get; set; }
[Key]
[Column(Order=2)]
public string ProviderKey { get; set; }
[Key]
[Column(Order=3)]
public string UserId { get; set; }
public virtual User User { get; set; }

在EF 6中,Key属性在应用于单个整数类型属性时会创建带有标识列的PK。组合键不会为整数属性创建标识列。