EntityType 'IdentityUserLogin' की कोई कुंजी परिभाषित नहीं है। इस EntityType के लिए कुंजी निर्धारित करें


105

मैं एंटिटी फ्रेमवर्क कोड फर्स्ट और एमवीसी 5 के साथ काम कर रहा हूं। जब मैंने अपना एप्लिकेशन इंडिविजुअल यूजर अकाउंट्स ऑथेंटिकेशन के साथ बनाया तो मुझे एक अकाउंट कंट्रोलर दिया गया और इसके साथ ही उन सभी आवश्यक वर्गों और कोड्स को काम करने के लिए जरूरी है जो इंडिव यूजर अकाउंट्स प्रमाणीकरण प्राप्त करने के लिए आवश्यक हैं। ।

पहले से ही कोड में यह था:

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' की कोई कुंजी निर्धारित नहीं है। इस EntityType की कुंजी को परिभाषित करें।

DX.DOMAIN.Context.IdentityUserRole:: EntityType 'IdentityUserRole' की कोई कुंजी निर्धारित नहीं है। इस EntityType की कुंजी को परिभाषित करें।

मैं क्या गलत कर रहा हूं? क्या इसलिए कि मेरे दो संदर्भ हैं?

अपडेट करें

ऑगस्टो के उत्तर को पढ़ने के बाद, मैं विकल्प 3 के साथ गया । यहाँ है कि मेरे DXContext वर्ग अब कैसा दिखता है:

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; }
}

मुझे यकीन नहीं था कि मुझे उपयोगकर्ता पर एक पासवर्ड संपत्ति की आवश्यकता होगी, क्योंकि डिफ़ॉल्ट ApplicationUser के पास और अन्य क्षेत्रों का एक गुच्छा है!

वैसे भी, उपरोक्त परिवर्तन ठीक बनाता है, लेकिन फिर से मुझे यह त्रुटि मिलती है जब आवेदन चलाया जाता है:

अमान्य कॉलम नाम UserId

UserId मेरे पर एक पूर्णांक संपत्ति है Artist.cs

जवाबों:


116

समस्या यह है कि आपका ApplicationUser IdentityUser से विरासत में मिला है , जिसे इस तरह परिभाषित किया गया है:

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; }

और उनकी प्राथमिक कुंजियों को विधि पहचानें OnModelCreating में कक्षा IdentityDbContext :

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. ApplicationDbContext के साथ अपने DXContext को मर्ज करें और एक डेटाबेस का उपयोग करें।
  3. एक ही तालिका के खिलाफ अलग DbContexts का उपयोग करें और तदनुसार अपने माइग्रेशन का प्रबंधन करें।

विकल्प 1: नीचे अपडेट देखें।

विकल्प 2: आप इस तरह एक DbContext के साथ समाप्त होगा:

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 होगा। आइए इसे आइडेंटिटी कॉनटेक्स्ट नाम दें। और आपके पास एक और DbContext होगा जिसे DXContext कहा जाता है:

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; }
}

इस समाधान के साथ मैं इकाई के लिए उपयोगकर्ता को एक ही टेबल पर मैप कर रहा हूं जैसे कि ApplicationUser।

फिर, कोड फर्स्ट माइग्रेशन का उपयोग करते हुए आपको डीएक्सकोटेक्स्ट के लिए IdentityContext और THEN के लिए माइग्रेशन जेनरेट करना होगा, शैलेन्द्र चौहान के इस बेहतरीन पोस्ट के बाद: मल्टीपल डेटा कंसर्ट के साथ कोड फर्स्ट माइग्रेशन

आपको DXContext के लिए उत्पन्न माइग्रेशन को संशोधित करना होगा। कुछ इस तरह से निर्भर करता है कि ApplicationUser और उपयोगकर्ता के बीच कौन से गुण साझा किए गए हैं:

        //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);
    }
}

इस तरह, मेरी n- टीयर क्रॉस कटिंग इकाइयां AspNetIdentity वर्गों से विरासत में प्राप्त नहीं होती हैं, और इसलिए मुझे इस रूपरेखा को हर परियोजना में आयात करने की आवश्यकता नहीं है जहां मैं उनका उपयोग करता हूं।

व्यापक पोस्ट के लिए क्षमा करें। मुझे उम्मीद है कि यह इस पर कुछ मार्गदर्शन दे सकता है। मैंने पहले ही उत्पादन वातावरण में विकल्प 2 और 3 का उपयोग किया है।

अद्यतन: विकल्प 1 का विस्तार करें

पिछले दो प्रोजेक्ट्स के लिए मैंने 1 विकल्प का उपयोग किया है: एक एस्पेनेटयूज़र क्लास होना जो आइडेंटिटीयूज़र से निकलता है, और एक अलग कस्टम क्लास जिसे ऐपयूज़र कहा जाता है। मेरे मामले में, DbContexts क्रमशः IdentityContext और DomainContext हैं। और मैंने AppUser की आईडी को इस तरह परिभाषित किया:

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; }

(TrackableEntity कस्टम अमूर्त आधार वर्ग है जो मैं अपने DomainContext संदर्भ के ओवरराइड सेवचेंज विधि में उपयोग करता हूं)

मैं पहले AspNetUser और फिर AppUser बनाता हूं। इस दृष्टिकोण के साथ दोष यह है कि आपने यह सुनिश्चित किया है कि आपकी "CreateUser" कार्यक्षमता ट्रांजेक्शनल है (याद रखें कि SaveChanges को अलग से कॉल करने वाले दो DbContexts होंगे)। TransactionScope का उपयोग किसी कारण से मेरे लिए काम नहीं कर रहा था, इसलिए मैंने कुछ बदसूरत करने के लिए काम किया, लेकिन यह मेरे लिए काम करता है:

        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;
        }

(कृपया, अगर कोई इस भाग को करने के बेहतर तरीके के साथ आता है, तो मैं इस जवाब पर टिप्पणी करने या उसे संपादित करने की सराहना करता हूं)

लाभ यह है कि आपको माइग्रेशन को संशोधित करने की आवश्यकता नहीं है और आप एस्परनेटयूज़र के साथ खिलवाड़ किए बिना ऐपयूज़र पर किसी भी पागल विरासत पदानुक्रम का उपयोग कर सकते हैं । और वास्तव में मैं अपनी पहचान के लिए स्वचालित माइग्रेशन का उपयोग करता हूं (संदर्भ जो कि IdentityDbContext से प्राप्त होता है):

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

    protected override void Seed(IdentityContext context)
    {
    }
}

इस दृष्टिकोण से आपके नेट-टियर-कटिंग एंटिटीज़ को एस्पेनेटइंडिटी वर्गों से विरासत में मिलने से बचने का भी लाभ है।


धन्यवाद @Augusto व्यापक पोस्ट के लिए। क्या किसी को काम करने के लिए विकल्प 3 प्राप्त करने के लिए माइग्रेशन का उपयोग करना होगा? जहाँ तक मुझे पता है, EF माइग्रेशन वापस परिवर्तन करने के लिए हैं? अगर मैं अपने डेटाबेस को छोड़ रहा हूं और फिर इसे बना रहा हूं और इसे प्रत्येक नए बिल्ड पर सीडिंग कर रहा हूं, तो क्या मुझे वह सब माइग्रेशन सामान चाहिए?
J86

मैंने माइग्रेशन का उपयोग किए बिना इसे आज़माया नहीं था। मुझे नहीं पता कि क्या आप उन्हें इस्तेमाल किए बिना पूरा कर सकते हैं। शायद यह संभव है। डेटाबेस में डाले गए किसी भी कस्टम डेटा को बनाए रखने के लिए मुझे हमेशा माइग्रेशन का उपयोग करना पड़ा।
अगस्तो बैरेटो

एक बात की ओर इशारा करते हैं, अगर आप माइग्रेशन का उपयोग करते हैं ... तो आपको AddOrUpdate(new EntityObject { shoes = green})"अपटर" के रूप में भी पता होना चाहिए । केवल संदर्भ में जोड़ने का विरोध किया, अन्यथा आप केवल डुप्लिकेट / निरर्थक इकाई संदर्भ जानकारी बना रहे होंगे।
शेफ_कोड

मैं 3rd विकल्प के साथ काम करना चाहता हूं, लेकिन मुझे यह पसंद नहीं है। किसी ने मुझे बता सकते हैं कि बिल्कुल कैसे IdentityContext की तरह दिखना चाहिए? cuz यह विकल्प 2 में बिल्कुल पसंद नहीं किया जा सकता है! क्या आप मेरी मदद कर सकते हैं @AugustoBarreto? मैंने कुछ इसी तरह का एक धागा बनाया है, हो सकता है कि आप वहां मेरी मदद कर सकें
एरियनट

आपका 'TrackableEntity' कैसा दिखता है?
सियारन

224

मेरे मामले में मुझे सही ढंग से IdentityDbContext से विरासत में मिला था (अपने स्वयं के कस्टम प्रकार और कुंजी परिभाषित के साथ), लेकिन अनजाने में बेस क्लास के OnModelCreating को कॉल हटा दिया था:

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

जिसने तब पहचान वर्गों से मेरे लापता सूचकांक को निर्धारित किया और मैं फिर से माइग्रेशन उत्पन्न कर सकता था और माइग्रेशन को उचित रूप से सक्षम कर सकता था।


एक ही समस्या थी "लाइन को हटा दिया"। आपके समाधान ने काम किया। :) ty।
डेवलपर Marius ėilėnas

2
इससे मेरा मुद्दा ठीक हो गया, जहाँ मुझे एक जटिल इकाई संबंध के लिए धाराप्रवाह का उपयोग करके कस्टम मैपिंग को शामिल करने के लिए OnModelCreating विधि को ओवरराइड करना पड़ा। पता चला कि मैं अपनी मैपिंग की घोषणा करने से पहले उत्तर में लाइन जोड़ना भूल गया क्योंकि मैं पहचान के रूप में उसी संदर्भ का उपयोग कर रहा हूं। चीयर्स।
डैन

यह काम करता है अगर कोई 'ओवरराइड शून्य ऑनमॉडेलक्रीटिंग' नहीं है, लेकिन यदि आप ओवरराइड करते हैं तो आपको 'आधार जोड़ने की जरूरत है। एमनोडेलक्रिएटिंग (मॉडलब्यूरी);' ओवरराइड करने के लिए। मेरी समस्या का समाधान किया।
जो

13

जो लोग ASP.NET पहचान 2.1 का उपयोग करें और डिफ़ॉल्ट से प्राथमिक कुंजी को बदल दिया है के लिए stringकरने के लिए या तो intया Guid, अगर आप अभी भी हो रही है

EntityType 'xxxxUserLogin' की कोई कुंजी निर्धारित नहीं है। इस EntityType की कुंजी को परिभाषित करें।

EntityType 'xxxxUserRole' की कोई कुंजी निर्धारित नहीं है। इस EntityType की कुंजी को परिभाषित करें।

आप शायद नए कुंजी प्रकार को निर्दिष्ट करना भूल गए हैं 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>
{
    ......
}

जब आप माइग्रेशन जोड़ने या डेटाबेस को अपडेट करने का प्रयास कर रहे हों, तो आपको वह 'कोई महत्वपूर्ण परिभाषित' त्रुटि नहीं मिलेगी।


मैं आईडी को इंट में बदलने की भी कोशिश कर रहा हूं और इस समस्या से जूझ रहा हूं, हालांकि मैंने नए कुंजी प्रकार को निर्दिष्ट करने के लिए अपना डीबीकॉन्टेक्स बदल दिया है। क्या कहीं और है जो मुझे जांचना चाहिए? मुझे लगा कि मैं बहुत सावधानी से निर्देशों का पालन कर रहा हूं।
काइल

1
@Kyle: क्या आप सभी संस्थाओं की आईडी को int, अर्थात, AppRole, AppUser, AppUserClaim, AppUserLogin और AppUserRole में बदलने की कोशिश कर रहे हैं? यदि हां, तो आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि आपने उन वर्गों के लिए नए कुंजी प्रकार निर्दिष्ट किए हैं। जैसे 'पब्लिक क्लास AppUserLogin: IdentityUserLogin <int> {}'
डेविड लिआंग

1
: यह अनुकूलित के बारे में आधिकारिक दस्तावेज़ प्राथमिक कुंजी डेटाप्रकार है docs.microsoft.com/en-us/aspnet/core/security/authentication/...
AdrienTorris

1
हां, मेरी समस्या यह थी, मुझे IdentityDbContext <AppUser> के बजाय सामान्य DbContext वर्ग से विरासत में मिला। धन्यवाद, इससे बहुत मदद मिली
yibe

13

नीचे के रूप में DbContext को बदलकर;

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

बस आधार करने के लिए OnModelCreatingमेथड कॉल में जोड़ रहा है। MnodelCreating (modelBuilder); और यह ठीक हो जाता है। मैं 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

मेरा मुद्दा भी ऐसा ही था - मेरे पास एक नई तालिका थी जो आइडेंटिटी उपयोगकर्ताओं के लिए टाई करने के लिए एएचडी बना रही थी। उपर्युक्त उत्तरों को पढ़ने के बाद, यह महसूस किया कि इसे IsdentityUser और विरासत में मिले उचितताओं के साथ क्या करना है। मेरे पास पहले से ही अपने स्वयं के संदर्भ के रूप में पहचान स्थापित की गई थी, इसलिए संबंधित उपयोगकर्ता तालिका को सही ईएफ संपत्ति के रूप में उपयोग करने के बजाय दोनों को एक साथ बांधने से बचने के लिए, मैंने संबंधित संस्थाओं को प्राप्त करने के लिए क्वेरी के साथ गैर-मैप की गई संपत्ति स्थापित की। (DataManager को वर्तमान संदर्भ को पुनः प्राप्त करने के लिए सेट किया गया है जिसमें OtherEntity मौजूद है।)

    [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);
            }
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.