在SQL中使用Proper UniqueIdentifier和实体框架标识

时间:2016-06-02 07:43:30

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

我已经浏览了很多StackOverflow帖子和大量博客但我无法弄清楚我在这里缺少什么....

使用:

EF 6.1.3

AspNet.Identity.Core 2.2.1

AspNet.Identity.EntityFramework 2.2.1

ApplicationUser:

    [Table("Users", Schema = "User")]
public class ApplicationUser : IdentityUser<Guid,ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{

}

ApplicationUserClaim

    [Table("UserClaims", Schema = "User")]
public class ApplicationUserClaim: IdentityUserClaim<Guid>
{

}

ApplicationUserLogin

    [Table("UserLogins", Schema = "User")]
public class ApplicationUserLogin: IdentityUserLogin<Guid>
{

}

ApplicationUserRole

    [Table("UserRoles", Schema = "User")]
public class ApplicationUserRole: IdentityUserRole<Guid>
{

}

ApplicationRole

    [Table("Roles", Schema = "Application")]
public class ApplicationRole: IdentityRole<Guid, ApplicationUserRole>
{

}

ApplicationDbContext

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser,ApplicationRole, Guid, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
.
.
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.HasDefaultSchema("Application");
            base.OnModelCreating(modelBuilder);
            SetupApplicationTables(modelBuilder);
            Configuration.ProxyCreationEnabled = false;
            Configuration.LazyLoadingEnabled = false;
        }
.
.
        private void SetupApplicationTables(DbModelBuilder modelBuilder)
        {
            // Application.Roles Table
            //modelBuilder.Entity<IdentityRole>().ToTable("Roles", "Application");

            //// User.UserLogins Table
            modelBuilder.Entity<ApplicationUserLogin>().HasKey(ul => new {ul.LoginProvider, ul.ProviderKey, ul.UserId});
            modelBuilder.Entity<ApplicationUserLogin>().ToTable("UserLogins", "User");

            //// User.Users Table
            //modelBuilder.Entity<IdentityUser>().ToTable("Users", "User");

            //// User.UserRoles Table
            modelBuilder.Entity<ApplicationUserRole>().HasKey(ur => new { ur.RoleId, ur.UserId});
            modelBuilder.Entity<ApplicationUserRole>().ToTable("UserRoles", "User");

            //// User.UserClaims Table
            //modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims", "User");
        }

当我尝试添加迁移时,我得到以下内容:

  

PeoplesParty.DataAccessLayer.DbContext.IdentityUserRole :: EntityType&#39; IdentityUserRole&#39;没有定义键。定义此EntityType的键。   PeoplesParty.DataAccessLayer.DbContext.IdentityUserLogin :: EntityType&#39; IdentityUserLogin&#39;没有定义键。定义此EntityType的键。   IdentityUserRoles:EntityType:EntitySet&#39; IdentityUserRoles&#39;基于类型&#39; IdentityUserRole&#39;没有定义键。   IdentityUserLogins:EntityType:EntitySet&#39; IdentityUserLogins&#39;基于类型&#39; IdentityUserLogin&#39;没有定义键。

为了使这项工作我做了一些改变,仍然没有运气:

// MODELS

[Table("Users", Schema = "User")]
public class ApplicationUser : IdentityUser<Guid,ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public ApplicationUser()
        : base()
    {

    }
}

[Table("Roles", Schema = "Application")]
public class ApplicationRole : IdentityRole<Guid, ApplicationUserRole>
{
    public ApplicationRole()
    {
        Id = Guid.NewGuid();
    }

    public ApplicationRole(string name)
    {
        Name = name;
        Id = Guid.NewGuid();
    }
}

[Table("UserClaims", Schema = "User")]
public class ApplicationUserClaim: IdentityUserClaim<Guid>
{
    public ApplicationUserClaim()
        : base()
    {

    }
}

[Table("UserLogins", Schema = "User")]
public class ApplicationUserLogin: IdentityUserLogin<Guid>
{
    public ApplicationUserLogin()
        : base()
    {

    }
}

[Table("UserRoles", Schema = "User")]
public class ApplicationUserRole : IdentityUserRole<Guid>
{
    public ApplicationUserRole()
        : base()
    {

    }
}

// DB CONTEXT
public class ApplicationDbContext 
    : IdentityDbContext<ApplicationUser, ApplicationRole, Guid, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(null);
    }

    public ApplicationDbContext()
        : this("PeoplesPartyDB2")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Configuration.ProxyCreationEnabled = false;
        Configuration.LazyLoadingEnabled = false;

        modelBuilder.HasDefaultSchema("Application");

        base.OnModelCreating(modelBuilder);
        SetupCustomIdentityTables(modelBuilder);
    }

    private void SetupCustomIdentityTables(DbModelBuilder modelBuilder)
    {
        if (modelBuilder == null)
        {
            throw new ArgumentNullException(nameof(modelBuilder));
        }

        // Needed to ensure subclasses share the same table
        var user = modelBuilder.Entity<ApplicationUser>().HasKey(au => au.Id).ToTable("Users", "User");
        user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId);
        user.HasMany(u => u.Claims).WithRequired().HasForeignKey(uc => uc.UserId);
        user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
        user.Property(u => u.UserName)
            .IsRequired()
            .HasMaxLength(256)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UserNameIndex") {IsUnique = true}));

        // CONSIDER: u.Email is Required if set on options?
        user.Property(u => u.Email).HasMaxLength(256);

        modelBuilder.Entity<ApplicationUserRole>().HasKey(ur => new {ur.UserId, ur.RoleId}).ToTable("UserRoles", "User");

        modelBuilder.Entity<ApplicationUserLogin>()
            .HasKey(ul => new {ul.LoginProvider, ul.ProviderKey, ul.UserId})
            .ToTable("UserLogins", "User");

        modelBuilder.Entity<ApplicationUserClaim>().HasKey(uc => uc.Id).ToTable("UserClaims", "User");

        var role = modelBuilder.Entity<ApplicationRole>().HasKey(ar => ar.Id).ToTable("Roles", "Application");
        role.HasMany(r => r.Users).WithRequired().HasForeignKey(ur => ur.RoleId);
        role.Property(r => r.Name)
            .IsRequired()
            .HasMaxLength(256)
            .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("RoleNameIndex") {IsUnique = true}));
    }
}

0 个答案:

没有答案
相关问题