使用Code First - MVC5创建表时添加引用AspNetUser的外键

时间:2015-07-24 14:43:26

标签: c# asp.net-mvc entity-framework visual-studio-2013

我正在创建一个Visual Studios MVC5 Web应用程序,我试图将AspNetUser表中的id作为外键引用。

我正在创建一个新表:

public class Patient
{
    public int PatientId { get; set; }
    public string HCN { get; set; }
    public string GP { get; set; }
    public string MedHis { get; set; }
    public string Medication { get; set; }
    public string CurrentPrescription { get; set; }
    public string PresentRX { get; set; }

    [ForeignKey("UserId")]
    public virtual ApplicationUser UserId { get; set; }
}

我的Patient配置类:

public class PatientConfig : EntityTypeConfiguration<Patient>
{
    public PatientConfig()
    {
        ToTable("Patient");

        Property(x => x.PatientId).HasColumnName("IntId");
        HasKey(x => x.PatientId);

        Property(x => x.HCN).HasColumnName("strHCN");
        Property(x => x.GP).HasColumnName("strGP");
        Property(x => x.MedHis).HasColumnName("strMedHis");
        Property(x => x.Medication).HasColumnName("strMedication");

        Property(x => x.CurrentPrescription).HasColumnName("strCurrentPrescription");

        Property(x => x.PresentRX).HasColumnName("strPresentRX");
        Property(x => x.UserId).HasColumnName("intUserId");
    }
}

首先我收到了错误

  

必须是不可为空的值类型才能将其用作参数

UserId属性下面,所以我删除了它

Property(x=> x.UserId).HasColumnName("intUserId");

当我尝试添加迁移时,出现以下错误:

  

属性&#39; UserId&#39;上的ForeignKeyAttribute on type&#39; ModelTest.Models.Patient&#39;无效。外键名称&#39; UserId&#39;没有在依赖类型&ModelTest.Models.Patient&#39;上找到。 Name值应该是以逗号分隔的外键属性名称列表。

我不明白如何找不到UserId,我们将非常感谢任何建议。

由于

2 个答案:

答案 0 :(得分:1)

这与任何其他关系一样。 ApplicationUser没有什么特别之处。您似乎并不真正了解如何首先设置实体框架关系。

如果关心您可以在应用程序中访问的显式外键属性,那么您需要添加到实体的所有内容是:

public virtual ApplicationUser User { get; set; }

这将导致Entity Framework在您的实体表上生成隐式外键,但您将无法直接在您的应用程序中访问此值。 User将是ApplicationUser的完整实例。

如果你想直接访问外键属性,那么你需要这样的东西:

[ForeignKey("User")]
public string UserId { get; set; }
public virtual ApplicationUser User { get; set; }

现在,除了允许您访问相应ApplicationUser实例的导航属性之外,实体上还有一个实际属性来保存外键值。

虽然实体框架实际上应该能够按惯例确定UserId本身是User导航属性的外键,但我发现使用{始终明确表示它是更好的{1}}属性。

另请注意,ForeignKey的类型为UserId。这种类型string默认使用主键。如果您愿意,可以更改它,但如果您只是使用标准部署,那么它将是IdentityUser而不是string,您似乎认为它将在您的代码中

答案 1 :(得分:0)

[ForeignKey("User")]<br/>
public string UserId { get; set; }<br/>
public virtual ApplicationUser User { get; set; }

当我将以上行添加到类中,然后迁移并更新数据库时,
 我创建了ApplicationUser表!