用户身份在不同环境中作为外键

时间:2016-03-27 23:31:16

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

我刚刚开始了一个新的EF 6.1 Code-First项目。

我正在使用身份2.0,其中ApplicationDbContext继承自IdentityDbContext

public class ApplicationDbContext
    : IdentityDbContext<ApplicationUser, ApplicationRole,
    string, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
    // Add additional items here as needed
}

并且是ApplicationUser模型的上下文。

我有另一个背景,ProfileContext

public class ProfileContext : DbContext
{
    public ProfileContext() : base()
    {
        Database.SetInitializer<ProfileContext>(new DropCreateDatabaseAlways<ProfileContext>());
    }

    public DbSet<Lifestyle> Lifestyles { get; set; }
    public DbSet<CountryName> CountryNames { get; set; }
    public DbSet<Language> Languages { get; set; }
    ...
}

有几个表需要与ApplicationUser一对一的关系。一个很好的例子是Lifestyle

    public class Lifestyle
{
    public int Id { get; set; }
    public string Profession { get; set; }
    public string JobDescription { get; set; }
    public string TV { get; set; }
    public string HomeMovies { get; set; }
    public string Movies { get; set; }
    public string EducationLevel { get; set; }
    public string ElementarySchool { get; set; }
    public string HighSchool { get; set; }
    public string College { get; set; }
    public string Degree { get; set; }
    public string JewishEducation { get; set; }
    public string IsraelStudy { get; set; }
    public string IsraelSchool { get; set; }
    public string Yeshiva { get; set; }

    public int NativeLanguage { get; set; }
    public int SpokenLanguage { get; set; }

    [ForeignKey("Id")]
    public ApplicationUser ApplicationUser { get; set; }
    [ForeignKey("NativeLanguage")]
    public Language Language { get; set; }
}

但我可以预见得到错误:

  

在模型生成期间检测到一个或多个验证错误:Models.Profile.ApplicationUserLogin :: EntityType'ApplicationUserLogin'没有定义键。定义此EntityType.Models.Profile.ApplicationUserRole的键:: EntityType'ApplicationUserRole'没有定义键。定义此EntityType的键。 Lifestyle_ApplicationUser_Target_Lifestyle_ApplicationUser_Source ::参照约束的从属角色中的所有属性的类型必须与主体角色中的相应属性类型相同。实体'Lifestyle'上的属性'Id'类型与参照约束'Lifestyle_ApplicationUser'中实体'ApplicationUser'上的属性'Id'不匹配。 ApplicationUserLogins:EntityType:EntitySet'ApplicationUserLogins'基于没有定义键的类型'ApplicationUserLogin'。 ApplicationUserRoles:EntityType:EntitySet'ApplicationUserRoles'基于类型'ApplicationUserRole',没有定义键。

因为ApplicationUser是来自ApplicationDbContext的表,而Lifestyle位于ProfileContext中。

由于我正在处理两个上下文,并且上下文 没有 在EF中混合,因此将任何表中的外键定义回{的正确方法是什么? {1}}中的{1}}?我认为这经常出现,我正在寻找最佳实践。

0 个答案:

没有答案