সত্তা টাইপ 'আইডেন্টিটিউজারলোগিন' এর কোনও কী সংজ্ঞায়িত করা হয়নি। এই সত্তা টাইপের জন্য কীটি সংজ্ঞায়িত করুন


105

আমি সত্ত্বা ফ্রেমওয়ার্ক কোড প্রথম এবং এমভিসি ৫ এর সাথে কাজ করছি Ind আমি যখন ব্যক্তিগত ব্যবহারকারী অ্যাকাউন্ট প্রমাণীকরণের সাথে আমার অ্যাপ্লিকেশন তৈরি করি তখন আমাকে একটি অ্যাকাউন্ট নিয়ামক দেওয়া হয়েছিল এবং তার সাথে ইন্ডিব ব্যবহারকারী অ্যাকাউন্টগুলির প্রমাণীকরণ পাওয়ার জন্য প্রয়োজনীয় সমস্ত শ্রেণি এবং কোড দেওয়া হয়েছিল was ।

ইতিমধ্যে বিদ্যমান কোডগুলির মধ্যে এটি ছিল:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext() : base("DXContext", throwIfV1Schema: false)
    {

    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

তবে আমি এগিয়ে গিয়ে কোডটি ব্যবহার করে প্রথমে নিজস্ব প্রসঙ্গ তৈরি করেছি, সুতরাং আমার এখন নিম্নলিখিতগুলিও রয়েছে:

public class DXContext : DbContext
{
    public DXContext() : base("DXContext")
    {
        
    }

    public DbSet<ApplicationUser> Users { get; set; }
    public DbSet<IdentityRole> Roles { get; set; }
    public DbSet<Artist> Artists { get; set; }
    public DbSet<Paintings> Paintings { get; set; }        
}

অবশেষে আমার বিকাশের সাথে কাজ করার জন্য কিছু ডেটা যুক্ত করার জন্য আমার কাছে নীচের বীজ পদ্ধতি রয়েছে:

protected override void Seed(DXContext context)
{
    try
    {

        if (!context.Roles.Any(r => r.Name == "Admin"))
        {
            var store = new RoleStore<IdentityRole>(context);
            var manager = new RoleManager<IdentityRole>(store);
            var role = new IdentityRole { Name = "Admin" };

            manager.Create(role);
        }

        context.SaveChanges();

        if (!context.Users.Any(u => u.UserName == "James"))
        {
            var store = new UserStore<ApplicationUser>(context);
            var manager = new UserManager<ApplicationUser>(store);
            var user = new ApplicationUser { UserName = "James" };

            manager.Create(user, "ChangeAsap1@");
            manager.AddToRole(user.Id, "Admin");
        }

        context.SaveChanges();

        string userId = "";

        userId = context.Users.FirstOrDefault().Id;

        var artists = new List<Artist>
        {
            new Artist { FName = "Salvador", LName = "Dali", ImgURL = "http://i62.tinypic.com/ss8txxn.jpg", UrlFriendly = "salvador-dali", Verified = true, ApplicationUserId = userId },
        };

        artists.ForEach(a => context.Artists.Add(a));
        context.SaveChanges();

        var paintings = new List<Painting>
        {
            new Painting { Title = "The Persistence of Memory", ImgUrl = "http://i62.tinypic.com/xx8tssn.jpg", ArtistId = 1, Verified = true, ApplicationUserId = userId }
        };

        paintings.ForEach(p => context.Paintings.Add(p));
        context.SaveChanges();
    }
    catch (DbEntityValidationException ex)
    {
        foreach (var validationErrors in ex.EntityValidationErrors)
        {
            foreach (var validationError in validationErrors.ValidationErrors)
            {
                Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
            }
        }
    }
    
}

আমার সমাধানটি সূক্ষ্মভাবে তৈরি করে, তবে যখন আমি চেষ্টা করি এবং এমন একটি নিয়ামককে অ্যাক্সেস করি যেখানে ডাটাবেসে অ্যাক্সেসের প্রয়োজন হয় আমি নিম্নলিখিত ত্রুটিটি পাই:

DX.DOMAIN.Context.IdentityUserLogin:: EntityType 'IdentityUserLogin' এর কোনও কী সংজ্ঞায়িত হয়নি। এই সত্তা টাইপের জন্য কীটি সংজ্ঞায়িত করুন।

DX.DOMAIN.Context.IdentityUserRole:: সত্তা টাইপ 'আইডেন্টিটি ইউজাররোল' এর কোনও কী সংজ্ঞায়িত হয়নি। এই সত্তা টাইপের জন্য কীটি সংজ্ঞায়িত করুন।

আমি কি ভুল করছি? আমার দুটি প্রসঙ্গ আছে বলেই কি?

হালনাগাদ

অগস্টোর জবাব পড়ার পরে আমি অপশন 3 নিয়ে গেলাম । আমার ডিএক্স কনটেক্সট ক্লাসটি এখন দেখতে কেমন তা এখানে:

public class DXContext : DbContext
{
    public DXContext() : base("DXContext")
    {
        // remove default initializer
        Database.SetInitializer<DXContext>(null);
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;

    }

    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<Artist> Artists { get; set; }
    public DbSet<Painting> Paintings { get; set; }

    public static DXContext Create()
    {
        return new DXContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<User>().ToTable("Users");
        modelBuilder.Entity<Role>().ToTable("Roles");
    }

    public DbQuery<T> Query<T>() where T : class
    {
        return Set<T>().AsNoTracking();
    }
}

আমি একটি User.csএবং একটি Role.csক্লাসও যুক্ত করেছি, তারা দেখতে এইরকম:

public class User
{
    public int Id { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
}

public class Role
{
    public int Id { set; get; }
    public string Name { set; get; }
}

আমি নিশ্চিত ছিলাম না যে আমার ব্যবহারকারীর একটি পাসওয়ার্ডের সম্পত্তি প্রয়োজন কিনা, যেহেতু ডিফল্ট অ্যাপ্লিকেশন ব্যবহারকারীটিতে এবং অন্যান্য ক্ষেত্রগুলির একটি গুচ্ছ রয়েছে!

যাইহোক, উপরের পরিবর্তনটি ঠিকঠাক করে তোলে, তবে অ্যাপ্লিকেশনটি চালানোর পরে আবার এই ত্রুটিটি পেয়েছি:

অবৈধ কলামের নাম ইউজারআইডি

UserId আমার উপর একটি পূর্ণসংখ্যা সম্পত্তি Artist.cs

উত্তর:


116

সমস্যাটি হ'ল আপনার অ্যাপ্লিকেশন ব্যবহারকারী আইডেন্টিটি ব্যবহারকারী থেকে উত্তরাধিকার সূত্রে প্রাপ্ত যা এটিকে সংজ্ঞায়িত করা হয়েছে:

IdentityUser : IdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUser
....
public virtual ICollection<TRole> Roles { get; private set; }
public virtual ICollection<TClaim> Claims { get; private set; }
public virtual ICollection<TLogin> Logins { get; private set; }

এবং তাদের প্রাথমিক কীগুলি ক্লাস আইডেন্টিটিডিবি কনটেক্সট অনমোডেলক্রিয়া পদ্ধতিতে ম্যাপ করা হয় :

modelBuilder.Entity<TUserRole>()
            .HasKey(r => new {r.UserId, r.RoleId})
            .ToTable("AspNetUserRoles");

modelBuilder.Entity<TUserLogin>()
            .HasKey(l => new {l.LoginProvider, l.ProviderKey, l.UserId})
            .ToTable("AspNetUserLogins");

এবং আপনার DXContext এর থেকে উদ্ভূত হয় না, সেই কীগুলি সংজ্ঞায়িত হয় না।

আপনি মধ্যে খনন তাহলে উৎস এর Microsoft.AspNet.Identity.EntityFramework, আপনি সবকিছু বুঝতে হবে।

আমি এই পরিস্থিতিটি কিছুক্ষণ আগে এসেছি এবং আমি তিনটি সম্ভাব্য সমাধান পেয়েছি (সম্ভবত আরও কিছু আছে):

  1. দুটি পৃথক ডাটাবেস বা একই ডাটাবেস কিন্তু বিভিন্ন টেবিলের বিপরীতে পৃথক DbContexts ব্যবহার করুন।
  2. আপনার DXContext অ্যাপ্লিকেশন DbContext এর সাথে মার্জ করুন এবং একটি ডাটাবেস ব্যবহার করুন।
  3. একই টেবিলের বিপরীতে পৃথক DbContexts ব্যবহার করুন এবং সে অনুযায়ী তাদের স্থানান্তর পরিচালনা করুন।

বিকল্প 1: নীচে আপডেট দেখুন।

বিকল্প 2: আপনি এইটির মতো একটি ডিবি কনটেক্সট দিয়ে শেষ করবেন:

public class DXContext : IdentityDbContext<User, Role,
    int, UserLogin, UserRole, UserClaim>//: DbContext
{
    public DXContext()
        : base("name=DXContext")
    {
        Database.SetInitializer<DXContext>(null);// Remove default initializer
        Configuration.ProxyCreationEnabled = false;
        Configuration.LazyLoadingEnabled = false;
    }

    public static DXContext Create()
    {
        return new DXContext();
    }

    //Identity and Authorization
    public DbSet<UserLogin> UserLogins { get; set; }
    public DbSet<UserClaim> UserClaims { get; set; }
    public DbSet<UserRole> UserRoles { get; set; }
    
    // ... your custom DbSets
    public DbSet<RoleOperation> RoleOperations { get; set; }

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

        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

        // Configure Asp Net Identity Tables
        modelBuilder.Entity<User>().ToTable("User");
        modelBuilder.Entity<User>().Property(u => u.PasswordHash).HasMaxLength(500);
        modelBuilder.Entity<User>().Property(u => u.Stamp).HasMaxLength(500);
        modelBuilder.Entity<User>().Property(u => u.PhoneNumber).HasMaxLength(50);

        modelBuilder.Entity<Role>().ToTable("Role");
        modelBuilder.Entity<UserRole>().ToTable("UserRole");
        modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
        modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
        modelBuilder.Entity<UserClaim>().Property(u => u.ClaimType).HasMaxLength(150);
        modelBuilder.Entity<UserClaim>().Property(u => u.ClaimValue).HasMaxLength(500);
    }
}

অপশন 3: আপনার কাছে বিকল্পের সমান একটি DbContext থাকবে 2 আসুন এটির নাম আইডেন্টিটি কনটেক্সট রাখুন। এবং আপনার কাছে DXContext নামে আর একটি DbContext থাকবে:

public class DXContext : DbContext
{        
    public DXContext()
        : base("name=DXContext") // connection string in the application configuration file.
    {
        Database.SetInitializer<DXContext>(null); // Remove default initializer
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
    }

    // Domain Model
    public DbSet<User> Users { get; set; }
    // ... other custom DbSets
    
    public static DXContext Create()
    {
        return new DXContext();
    }

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

        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        // IMPORTANT: we are mapping the entity User to the same table as the entity ApplicationUser
        modelBuilder.Entity<User>().ToTable("User"); 
    }

    public DbQuery<T> Query<T>() where T : class
    {
        return Set<T>().AsNoTracking();
    }
}

যেখানে ব্যবহারকারী:

public class User
{
    public int Id { get; set; }

    [Required, StringLength(100)]
    public string Name { get; set; }

    [Required, StringLength(128)]
    public string SomeOtherColumn { get; set; }
}

এই সমাধান সহ আমি সত্তা ব্যবহারকারীকে সত্তা অ্যাপ্লিকেশন ব্যবহারকারী হিসাবে একই টেবিলটিতে ম্যাপ করছি।

তারপর, কোড প্রথম স্থানান্তরণ ব্যবহার করে আপনি IdentityContext জন্য মাইগ্রেশন তৈরী করা এবং করতে হবে তাহলে DXContext জন্য, শৈলেন্দ্র চৌহান থেকে এই মহান পোস্টের করুন: একাধিক ডেটা অনুষঙ্গ মাধ্যমে কোডের প্রথম স্থানান্তরণ

আপনাকে DXContext এর জন্য উত্পন্ন মাইগ্রেশনটি পরিবর্তন করতে হবে। অ্যাপ্লিকেশন ব্যবহারকারী এবং ব্যবহারকারীর মধ্যে কোন বৈশিষ্ট্য ভাগ করা হয়েছে তার উপর নির্ভর করে এরকম কিছু:

        //CreateTable(
        //    "dbo.User",
        //    c => new
        //        {
        //            Id = c.Int(nullable: false, identity: true),
        //            Name = c.String(nullable: false, maxLength: 100),
        //            SomeOtherColumn = c.String(nullable: false, maxLength: 128),
        //        })
        //    .PrimaryKey(t => t.Id);
        AddColumn("dbo.User", "SomeOtherColumn", c => c.String(nullable: false, maxLength: 128));

এবং তারপরে এই কাস্টম ক্লাসটি ব্যবহার করে গ্লোবাল.অ্যাসাক্স বা আপনার অ্যাপ্লিকেশনটির অন্য কোনও স্থান থেকে ক্রম অনুসারে স্থানান্তর (প্রথম পরিচয় স্থানান্তর) চালানো হচ্ছে:

public static class DXDatabaseMigrator
{
    public static string ExecuteMigrations()
    {
        return string.Format("Identity migrations: {0}. DX migrations: {1}.", ExecuteIdentityMigrations(),
            ExecuteDXMigrations());
    }

    private static string ExecuteIdentityMigrations()
    {
        IdentityMigrationConfiguration configuration = new IdentityMigrationConfiguration();
        return RunMigrations(configuration);
    }

    private static string ExecuteDXMigrations()
    {
        DXMigrationConfiguration configuration = new DXMigrationConfiguration();
        return RunMigrations(configuration);
    }

    private static string RunMigrations(DbMigrationsConfiguration configuration)
    {
        List<string> pendingMigrations;
        try
        {
            DbMigrator migrator = new DbMigrator(configuration);
            pendingMigrations = migrator.GetPendingMigrations().ToList(); // Just to be able to log which migrations were executed

            if (pendingMigrations.Any())                
                    migrator.Update();     
        }
        catch (Exception e)
        {
            ExceptionManager.LogException(e);
            return e.Message;
        }
        return !pendingMigrations.Any() ? "None" : string.Join(", ", pendingMigrations);
    }
}

এইভাবে, আমার এন-টায়ার ক্রস কাটিং সত্তাগুলি AspNetIdentity ক্লাস থেকে উত্তরাধিকার সূত্রে শেষ হয় না এবং তাই আমি যে প্রকল্পগুলিতে সেগুলি ব্যবহার করি সেখানে প্রতিটি প্রকল্পে আমাকে এই কাঠামোটি আমদানি করতে হবে না।

বিস্তৃত পোস্টের জন্য দুঃখিত। আমি আশা করি এটি এ সম্পর্কে কিছু দিকনির্দেশনা দিতে পারে। আমি ইতিমধ্যে উত্পাদন পরিবেশে 2 এবং 3 বিকল্প ব্যবহার করেছি।

আপডেট: অপশন 1 প্রসারিত করুন

শেষ দুটি প্রকল্পের জন্য আমি প্রথম বিকল্পটি ব্যবহার করেছি: আইডেন্টিটি ব্যবহারকারী থেকে প্রাপ্ত এস্পনেট ব্যবহারকারী শ্রেণি এবং অ্যাপ্লুউজার নামে একটি পৃথক কাস্টম শ্রেণি রয়েছে। আমার ক্ষেত্রে, DbContexts যথাক্রমে আইডেন্টিটি কনটেক্সট এবং ডোমেনকন্টেক্সট। এবং আমি অ্যাপ ব্যবহারকারীর আইডিটিকে এটির মতো সংজ্ঞায়িত করেছি:

public class AppUser : TrackableEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    // This Id is equal to the Id in the AspNetUser table and it's manually set.
    public override int Id { get; set; }

(ট্র্যাকএলএন্টিটি হ'ল কাস্টম অ্যাবস্ট্রাক্ট বেস ক্লাস যা আমি আমার ডোমেন কনটেক্সট প্রসঙ্গে ওভাররাইড হওয়া সেভচেনজ পদ্ধতিতে ব্যবহার করি)

আমি প্রথমে AspNetUser এবং তারপরে AppUser তৈরি করি। এই পদ্ধতির অপূর্ণতা হ'ল আপনি নিশ্চিত করেছেন যে আপনার "ক্রিয়েটিউজার" কার্যকারিতাটি লেনদেনযোগ্য (মনে রাখবেন আলাদাভাবে সেভচেন্সে কল করার জন্য দুটি ডিবিকন্টেক্সট থাকবে)। লেনদেনস্কোপ ব্যবহার কোনও কারণে আমার পক্ষে কাজ করে না, তাই আমি খারাপ কিছু করার চেষ্টা করেছি তবে তা আমার পক্ষে কাজ করে:

        IdentityResult identityResult = UserManager.Create(aspNetUser, model.Password);

        if (!identityResult.Succeeded)
            throw new TechnicalException("User creation didn't succeed", new LogObjectException(result));

        AppUser appUser;
        try
        {
            appUser = RegisterInAppUserTable(model, aspNetUser);
        }
        catch (Exception)
        {
            // Roll back
            UserManager.Delete(aspNetUser);
            throw;
        }

(দয়া করে যদি কেউ এই অংশটি করার আরও ভাল উপায় নিয়ে আসে তবে আমি এই উত্তরে মন্তব্য করা বা কোনও প্রস্তাব দেওয়ার প্রশংসা করি)

সুবিধাগুলি হ'ল আপনাকে মাইগ্রেশনগুলি সংশোধন করতে হবে না এবং অ্যাপ্লিকেশন ব্যবহারকারীকে অ্যাস্পনেট ইউজারের সাথে গোলমাল না করে কোনও পাগল উত্তরাধিকারের স্তরক্রম ব্যবহার করতে পারেন । এবং প্রকৃতপক্ষে আমি আমার আইডেন্টিটি কনটেক্সট (আইডেন্টিটিডিবি কনটেক্সট থেকে প্রাপ্ত প্রসঙ্গ) এর জন্য স্বয়ংক্রিয় স্থানান্তরগুলি ব্যবহার করি:

public sealed class IdentityMigrationConfiguration : DbMigrationsConfiguration<IdentityContext>
{
    public IdentityMigrationConfiguration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = false;
    }

    protected override void Seed(IdentityContext context)
    {
    }
}

এই পদ্ধতির আপনার এন-টায়ার ক্রস কাটিং সংস্থাগুলি AspNetIdentity ক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া এড়িয়ে যাওয়ার সুবিধাও রয়েছে।


বিস্তৃত পোস্টের জন্য @ অগস্টোকে ধন্যবাদ। অপশন 3 কাজ করার জন্য কি কোনওকে মাইগ্রেশন ব্যবহার করতে হবে? আমি যতদূর জানি, ইএফ মাইগ্রেশনগুলি পরিবর্তনগুলি রোল করার জন্য? যদি আমি আমার ডাটাবেসটি ফেলে দিচ্ছি এবং তারপরে এটি নতুন করে তৈরি এবং প্রতিটি নতুন বিল্ডে বীজ বপন করছি, তবে আমার কি সেই সমস্ত স্থানান্তরের স্টাফগুলি করা দরকার?
J86

আমি মাইগ্রেশন ব্যবহার না করে এটি চেষ্টা করিনি। আপনি এগুলি ব্যবহার না করে আপনি এটি সম্পাদন করতে পারবেন কিনা তা আমি জানি না। সম্ভবত এটি সম্ভব। ডেটাবেসে সন্নিবেশিত যে কোনও কাস্টম ডেটা ধরে রাখতে আমাকে সর্বদা মাইগ্রেশন ব্যবহার করতে হয়েছিল।
আগস্টো ব্যারেটো

একটি বিষয় উল্লেখ করতে হবে, আপনি যদি মাইগ্রেশন ব্যবহার করেন ... আপনার AddOrUpdate(new EntityObject { shoes = green})"উপস্থাপক" হিসাবে জানা উচিত । কেবলমাত্র প্রসঙ্গে যুক্ত করার বিরোধিতা করুন, অন্যথায় আপনি কেবল নকল / অনর্থক সত্তা প্রসঙ্গ তথ্য তৈরি করবেন।
শেফ_কোড

আমি ৩ য় বিকল্পের সাথে কাজ করতে চাই, তবে আমি এটি পাই না। কেউ দয়া করে আমাকে বলতে পারেন যে আইডেন্টিটি কনটেক্সটটি ঠিক কেমন দেখতে হবে? এটি অপশন 2 এর মতো ঠিক মতো হতে পারে না! আপনি কি আমাকে অগস্টো বার্রেটোকে সাহায্য করতে পারেন? অনুরূপ কিছু সম্পর্কে আমি একটি থ্রেড তৈরি করেছি, সম্ভবত আপনি আমাকে সেখানে সহায়তা করতে পারেন
আরিয়ানিত

আপনার 'ট্র্যাকযোগ্য যোগ্যতা' দেখতে কেমন?
Ciaran গ্যালাগার

224

আমার ক্ষেত্রে আমি সঠিকভাবে আইডেন্টিটি ডিবি কনটেক্সট থেকে উত্তরাধিকার পেয়েছি (আমার নিজস্ব কাস্টম টাইপ এবং কী সংজ্ঞায়িত) তবে অসাবধানতাবশত বেস ক্লাসের অনমোডেল ক্রিয়েটিংয়ের কলটি সরিয়ে নিয়েছি:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder); // I had removed this
    /// Rest of on model creating here.
}

যা পরে পরিচয় শ্রেণি থেকে আমার অনুপস্থিত সূচীগুলি স্থির করে দেয় এবং আমি তখন মাইগ্রেশন তৈরি করতে এবং যথাযথভাবে মাইগ্রেশন সক্ষম করতে পারি।


একই সমস্যা "লাইনটি মুছে ফেলেছে"। আপনার সমাধান কাজ করেছে। :) টাই
বিকাশকারী মারিয়াস Žilėnas

2
এটি আমার সমস্যাটিকে স্থির করেছে, যেখানে আমাকে জটিল সত্তার সম্পর্কের জন্য সাবলীল এপি ব্যবহার করে একটি কাস্টম ম্যাপিং অন্তর্ভুক্ত করার জন্য অনমোডেল ক্রিয়েটিং পদ্ধতি ওভাররাইড করতে হয়েছিল। দেখা যাচ্ছে যে আমি পরিচয়ের মতো একই প্রসঙ্গটি ব্যবহার করছি বলে আমার ম্যাপিং ঘোষণার আগে উত্তরে আমি লাইনটি যুক্ত করতে ভুলে গেছি। চিয়ার্স।
ড্যান

এটি 'ওভাররাইড অকার্যকর অনমোডেলক্রিয়াটিং' না থাকলে এটি কাজ করে তবে যদি আপনি ওভাররাইড করেন তবে আপনাকে 'বেস.অনমোডেলক্রিটিং (মডেলবিল্ডার) যুক্ত করতে হবে;' ওভাররাইডে আমার সমস্যা স্থির।
জো

13

যারা এএসপি.নেট পরিচয় ২.১ ব্যবহার করেন এবং প্রাথমিক কীটি ডিফল্ট stringথেকে অন্যথায় পরিবর্তন করেছেন intবা Guidযদি আপনি এখনও পান

এনটিটি টাইপ 'xxxxUserLogin' এর কোনও কী সংজ্ঞায়িত করা হয়নি। এই সত্তা টাইপের জন্য কীটি সংজ্ঞায়িত করুন।

সত্তা টাইপ 'xxxxUserRole' এর কোনও কী সংজ্ঞায়িত করা হয়নি। এই সত্তা টাইপের জন্য কীটি সংজ্ঞায়িত করুন।

আপনি সম্ভবত নতুন কী টাইপটি নির্দিষ্ট করতে ভুলে গেছেন IdentityDbContext:

public class AppIdentityDbContext : IdentityDbContext<
    AppUser, AppRole, int, AppUserLogin, AppUserRole, AppUserClaim>
{
    public AppIdentityDbContext()
        : base("MY_CONNECTION_STRING")
    {
    }
    ......
}

আপনি যদি শুধু আছে

public class AppIdentityDbContext : IdentityDbContext
{
    ......
}

অথবা এমনকি

public class AppIdentityDbContext : IdentityDbContext<AppUser>
{
    ......
}

আপনি যখন মাইগ্রেশন যুক্ত করতে বা ডাটাবেস আপডেট করার চেষ্টা করছেন তখন আপনি সেই 'কী কী সংজ্ঞায়িত' ত্রুটি পাবেন।


আমি আইডিটি একটি ইন্টারেও পরিবর্তন করার চেষ্টা করছি এবং এই সমস্যাটি হচ্ছে, তবে আমি নতুন কী টাইপ নির্দিষ্ট করতে আমার DbContext পরিবর্তন করেছি। আমার অন্য কোথাও পরীক্ষা করা উচিত? আমি ভেবেছিলাম আমি খুব সাবধানে নির্দেশনা অনুসরণ করছি।
কাইল

1
@ কাইল: আপনি কি সমস্ত সত্তার আইডি ইন্টে, অর্থাৎ, অ্যাপরোল, অ্যাপস ব্যবহারকারীর, অ্যাপ্লিকেশনক্লেইম, অ্যাপইউজারলগিন এবং অ্যাপসুজারলকে পরিবর্তিত করার চেষ্টা করছেন? যদি তা হয় তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনি এই ক্লাসগুলির জন্য নতুন কী টাইপ নির্দিষ্ট করেছেন। 'পাবলিক ক্লাস অ্যাপ্লাইজারলগিন: আইডেন্টিটিউজারলগিন <int> {}'
ডেভিড লিয়াং

1
প্রাইমারি কীগুলি ডাটাটাইপটি কাস্টমাইজ করার বিষয়ে এটি সরকারী ডক: ডকস.মাইক্রোসফট.ইনস
এস্পনেট

1
হ্যাঁ, আমার সমস্যা ছিল, আমি আইডেন্টিটিডিবি কনটেক্সট <অ্যাপ্লিকেশন> এর পরিবর্তে সাধারণ ডিবিকন্টেক্সট ক্লাস থেকে উত্তরাধিকার সূত্রে পেয়েছি। ধন্যবাদ, এটি অনেক সাহায্য করেছে
yibe

13

নীচে হিসাবে DbContext পরিবর্তন করে;

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
    }

OnModelCreatingবেসে কেবল মেথড কলে যুক্ত করা হচ্ছে nঅনমোডেলক্রিয়াটিং (মডেলবিল্ডার); এবং এটা ঠিক হয়ে যায়। আমি EF6 ব্যবহার করছি।

সিনেটরকে বিশেষ ধন্যবাদ


1
 protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            //foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
            //    relationship.DeleteBehavior = DeleteBehavior.Restrict;

            modelBuilder.Entity<User>().ToTable("Users");

            modelBuilder.Entity<IdentityRole<string>>().ToTable("Roles");
            modelBuilder.Entity<IdentityUserToken<string>>().ToTable("UserTokens");
            modelBuilder.Entity<IdentityUserClaim<string>>().ToTable("UserClaims");
            modelBuilder.Entity<IdentityUserLogin<string>>().ToTable("UserLogins");
            modelBuilder.Entity<IdentityRoleClaim<string>>().ToTable("RoleClaims");
            modelBuilder.Entity<IdentityUserRole<string>>().ToTable("UserRoles");

        }
    }

0

আমার সমস্যাটি একই রকম ছিল - আমার কাছে একটি নতুন টেবিল ছিল যা আমি পরিচয় ব্যবহারকারীদের সাথে বাঁধার জন্য এটি তৈরি করছিলাম। উপরের উত্তরগুলি পড়ার পরে, বুঝতে পারলাম এটির সাথে ইসডেন্টিটি ইউজার এবং উত্তরাধিকারসূত্রে প্রাপ্ত প্রোপারাইটগুলির সাথে সম্পর্কযুক্ত। আমি ইতিমধ্যে সনাক্তকরণটি তার নিজস্ব প্রসঙ্গ হিসাবে সেট আপ করেছি, সুতরাং দু'জনকে সহজাতভাবে বাঁধা এড়াতে, সত্যিকারের EF সম্পত্তি হিসাবে সম্পর্কিত ব্যবহারকারী টেবিলটি ব্যবহার না করে, সম্পর্কিত সংস্থাগুলি পাওয়ার জন্য আমি কোয়েরি সহ একটি ম্যাপযুক্ত সম্পত্তি সেট আপ করেছি। (ডেটা ম্যানেজারটি বর্তমান প্রসঙ্গটি পুনরুদ্ধার করতে সেট আপ করা হয়েছে যেখানে অন্যান্য কর্মকাণ্ড বিদ্যমান))

    [Table("UserOtherEntity")]
        public partial class UserOtherEntity
        {
            public Guid UserOtherEntityId { get; set; }
            [Required]
            [StringLength(128)]
            public string UserId { get; set; }
            [Required]
            public Guid OtherEntityId { get; set; }
            public virtual OtherEntity OtherEntity { get; set; }
        }

    public partial class UserOtherEntity : DataManager
        {
            public static IEnumerable<OtherEntity> GetOtherEntitiesByUserId(string userId)
            {
                return Connect2Context.UserOtherEntities.Where(ue => ue.UserId == userId).Select(ue => ue.OtherEntity);
            }
        }

public partial class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }

        [NotMapped]
        public IEnumerable<OtherEntity> OtherEntities
        {
            get
            {
                return UserOtherEntities.GetOtherEntitiesByUserId(this.Id);
            }
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.