协助同时保存USERS和AspNetUser

时间:2017-11-21 21:59:57

标签: c# .net asp.net-mvc entity-framework asp.net-identity

请帮助。我整天都没有重做系统的各个部分,尝试了很多不同的解决方案,但我最终没有任何想法。

我有一个相同应用程序的解决方案。在其中一个应用程序(我尝试隔离数据持久性)中,我使用Entity Framework中的DataBase First方法创建了上下文。注意:我已经在数据库中包含了创建脚本Identity表。

在我的解决方案的另一层中,我添加了一个没有用户控制的纯MVC应用程序。所以我添加了nuget,Entity Framework和Identity。

最后我创建了ApplicationUser,IdentityDbContext和ApplicationRoleManager:

public partial class ApplicationUser : IdentityUser
{
    [Display(Name = "Usuario", Description = "Identificação para Login")]
    [Required(ErrorMessage = "000027 - O Login não pode ser vazio ou nulo.")]
    [MaxLength(30, ErrorMessage = "000028 - O Login pode ter no máximo 30 caracteres.")]
    [DuplicadoNaBase("AspNetUsersDao", "SelecionarPorLogin", ErrorMessage = "000031 - O Login informado já existe na base de dados.")]
    public string LOGIN { get; set; }

    [NotMapped]
    [Display(Name = "Senha", Description = "Senha para Login")]
    [Required(ErrorMessage = "000029 - A senha não pode ser vazia ou nula.")]
    [MaxLength(30, ErrorMessage = "000030 - A senha pode ter no máximo 30 caracteres.")]
    [DataType(DataType.Password)]
    public string SENHA { get; set; }

    public virtual USUARIOS USUARIOS { get; set;}

    [NotMapped]
    public string Perfil { get; set; }
}

public class GPSdEntitiesIdentity :  IdentityDbContext<ApplicationUser>
{
    public GPSdEntitiesIdentity() : base("IdentityConnection")
    {
    }
}
public class ApplicationRoleManager : RoleManager<IdentityRole, string>
{
    public ApplicationRoleManager(IRoleStore<IdentityRole, string> roleStore)
        : base(roleStore)
    {
    }

    public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
    {
        return new ApplicationRoleManager(new RoleStore<IdentityRole>(new GPSdEntities()));
    }
}

基本上我的问题发生了,因为我已经有了一个带有USER表的数据库。最初我尝试将我的USER表与AspNetUser合并。但它没有用,因为AspNetUser有GUID(字符串Id),我不得不在数据库中重做很多关系。所以我保留了两张桌子。我在我的USERS表中添加了一个IdAspNetUser,他们之间有一对一的关系。

我创建了一个与ApplpicationUser配合使用的View来注册用户,它运行正常。但我觉得这很奇怪,因为我有一个userManager.add,然后是1个ContextPerformance.USUARIOS.Add。由于它们之间的关系是1比1,所以我有一个绝妙的想法,即在ApplicationUser中添加一个虚拟属性USERS USERS {get;当我开始犯错误和单圈时间的时候。

当我尝试:

private UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new GPSdEntitiesIdentity()));
List<ApplicationUser> ApplicationUsers = new List<ApplicationUser>();
ApplicationUsers = userManager.Users.ToList();

我收到以下错误:

  

System.Data.Entity.ModelConfiguration.ModelValidationException&#34;在模型生成期间检测到一个或多个验证错误:   GPSd.Web.MVC.IdentityContext.AspNetUserLogins :: EntityType   &#39; AspNetUserLogins&#39;没有定义键。为此设置密钥   的EntityType。 AspNetUserLogins:EntityType:EntitySet&#39; AspNetUserLogins&#39;   基于类型&#39; AspNetUserLogins&#39;没有定义键。&#34;

如果我将ApplicationUser中的USERS虚拟属性标记为[NotMapped],则应用程序再次运行,但是我必须单独保存AspNetId和USER

我试图做这样简单的事情:

ApplicationUser identityUser = new ApplicationUser
{
   UserName = model.LOGIN,
   LOGIN = model.LOGIN,
   SENHA = model.SENHA,
   USERS = model.USERS
};
IdentityResult resultado = userManager.Create(identityUser, model.SENHA);

1 个答案:

答案 0 :(得分:0)

GPSdEntitiesIdentity添加:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

      modelBuilder.Entity<IdentityUserLogin>()
            .HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId })
            .ToTable("AspNetUserLogins");// Database Table Name   

    }