ASP.NET পরিচয় DbContext বিভ্রান্তি


196

আইডেন্টিটি মোডেলস.এস-এ এই টুকরা কোডের সাথে একটি ডিফল্ট এমভিসি 5 অ্যাপ আসে - ডিফল্ট টেমপ্লেটগুলির জন্য কোডের এই টুকরাটি সমস্ত এএসপি.নেট সনাক্তকরণ ক্রিয়াকলাপের জন্য:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
}

আমি যদি সত্তা ফ্রেমওয়ার্কের সাথে ভিউগুলি ব্যবহার করে কোনও নতুন নিয়ামককে মশগুল করি এবং কথোপকথনে একটি "নতুন ডেটা প্রসঙ্গ ..." তৈরি করি, তবে আমি এটি আমার জন্য উত্পন্ন করব:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace WebApplication1.Models
{
    public class AllTheOtherStuffDbContext : DbContext
    {
        // You can add custom code to this file. Changes will not be overwritten.
        // 
        // If you want Entity Framework to drop and regenerate your database
        // automatically whenever you change your model schema, please use data migrations.
        // For more information refer to the documentation:
        // http://msdn.microsoft.com/en-us/data/jj591621.aspx

        public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
        {
        }

        public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }

    }
} 

যদি আমি EF ব্যবহার করে অন্য কোনও নিয়ামক + দৃশ্যের মাপসই করি, উদাহরণস্বরূপ কোনও অ্যানিমাল মডেলের জন্য বলুন, এই নতুন লাইনটি নীচে স্বয়ংক্রিয়ভাবে তৈরি হবে public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }- এর মতো:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace WebApplication1.Models
{
    public class AllTheOtherStuffDbContext : DbContext
    {
        // You can add custom code to this file. Changes will not be overwritten.
        // 
        // If you want Entity Framework to drop and regenerate your database
        // automatically whenever you change your model schema, please use data migrations.
        // For more information refer to the documentation:
        // http://msdn.microsoft.com/en-us/data/jj591621.aspx

        public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
        {
        }

        public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
        public System.Data.Entity.DbSet<WebApplication1.Models.Animal> Animals { get; set; }

    }
} 

ApplicationDbContext(সমস্ত এএসপি। নেট পরিচয় স্টাফের জন্য) উত্তরাধিকার সূত্রে প্রাপ্ত হয় IdentityDbContextযা থেকে প্রাপ্ত হয় DbContextAllOtherStuffDbContext(আমার নিজের জিনিসগুলির জন্য) থেকে উত্তরাধিকার সূত্রে প্রাপ্ত DbContext

সুতরাং আমার প্রশ্নটি হ'ল:

এই দুটি ( ApplicationDbContextএবং AllOtherStuffDbContext) এর মধ্যে কোনটি আমার নিজের অন্যান্য সমস্ত মডেলের জন্য ব্যবহার করা উচিত? অথবা আমি কেবল ডিফল্ট অটোজেনারেটেড ব্যবহার করব ApplicationDbContextযেহেতু এটি ব্যবহার করে সমস্যা হওয়া উচিত নয় যেহেতু এটি বেস বর্গ থেকে প্রাপ্ত DbContext, বা কিছু ওভারহেড থাকবে? আপনি শুধুমাত্র একটি ব্যবহার করা উচিত DbContextআপনার সমস্ত মডেলের (আমি এই কোথাও পড়েছি) জন্য আপনার অ্যাপে বস্তুর তাই আমি এমনকি উভয় ব্যবহার করছেন না বিবেচনা করা উচিত ApplicationDbContextএবং AllOtherStuffDbContextএকটি একক অ্যাপ্লিকেশানে? বা এএসপি.এনইটি পরিচয় সহ এমভিসি 5 এ সেরা অনুশীলন কী?


1
যাইহোক; এটি দুর্দান্তভাবে এবং ডকুমেন্টটি স্ক্যান করার সময় আমার চোখের জন্য অপ্রয়োজনীয়: সর্বজনীন System.Data.Entity.DbSet <WebApplication1.Models.Movie> সিনেমা {পেতে; সেট; । - সিস্টেম.ডাটা.এন্টিটি এবং ওয়েব অ্যাপ্লিকেশন 1.মোডেলস অংশ। এটি ঘোষণা থেকে সরানো এবং পরিবর্তে ব্যবহারের বিবৃতি বিভাগে নাম স্থান যুক্ত করা যাবে না?
পুসইনবুটস

পুস - হ্যাঁ আপনার মন্তব্যে। এটা ঠিক কাজ করা উচিত।
এসবি 2055

এটি একটি ভাল এবং কার্যকরী উদাহরণ, (এমভিসি 6) এবং এএসপি.নেট 5 আইডেন্টিটি (> = ভি 3) ফ্রেমওয়ার্ক ছাড়া মঙ্গোডিবি.ড্রাইভার (> = ভি 2.1.0) github.com/saan800/SanSoft এর সাথে
স্টানিস্লাভ প্রুসাক

উত্তর:


178

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


52
এটি একটি একক এমভিসি 5 প্রকল্পের জন্য তবে উত্সাহিত নয় যখন উত্পন্ন DbContext একাধিক প্রকল্পের মধ্যে ভাগ করা হয়, কিছু এমভিসি 5 নয়, যেখানে কারও কারও কাছে পরিচয় সমর্থন প্রয়োজন হয় না।
ডেভ

সহজ রক্ষণাবেক্ষণযোগ্যতা এবং আরও ভাল সম্পর্কের সততার জন্য একই ডাটাবেসের পক্ষে ভোট দিয়েছেন। কারণ ব্যবহারকারী সত্তা এবং ভূমিকা সত্তা সহজেই অন্যান্য অ্যাপ্লিকেশন সামগ্রীর সাথে সম্পর্কিত হবে।
anIBMer

6
@ ডেভ - এটি দুটি পৃথক প্রসঙ্গ ব্যবহার করে ব্যবহারকারীর ডেটা বিভাজনকে জটিল করে তোলে। ব্যবহারকারীর দ্বারা আপনার এমভিসি অ্যাপ্লিকেশন পার্টিশন ডেটা করে তবে অন্যান্য অ্যাপ্লিকেশনগুলি তা করে না। একই ডেটা স্তরটি ভাগ করে নেওয়া সাধারণ, তবে আমি মনে করি এটি সাধারণ নয় যে কিছু প্রকল্পের ব্যবহারকারীর দ্বারা ভাগ করা ডেটা প্রয়োজন হয়, এবং কিছু না করে।
রিকঅ্যান্ডএমএসএফটি

1
কেউ কি এমভিসি প্রকল্প থেকে অ্যাপ্লিকেশন ডিবিসিএনটেক্সট বের করে এবং এটি বিদ্যমান ইএফ ডেটা স্তরে অন্তর্ভুক্ত করার উপায় সম্পর্কে সচেতন? দুটি বর্ণিত হওয়া, উপরে বর্ণিত হিসাবে সঠিক পদ্ধতি বলে মনে হচ্ছে, তবে আমি একটি সময়ের সীমাবদ্ধ প্রকল্পে কাজ করছি। আমি এটি প্রথমবারের মাধ্যমেই করতে চাই তবে আমার সামনে থাকা সমস্ত গেটচেগুলিতে মাথা উঁচু করে ভালোবাসতে চাই ...
মাইক দেবেনি

7
প্রায় এক ঘন্টা সন্ধান করার পরে এই উত্তরটি আমাকে সঠিক দিকে নির্দেশ করেছে - তবে কীভাবে এটি বাস্তবায়ন করা যায় তা আমি নিশ্চিত ছিলাম না (খুব আক্ষরিক ব্যক্তির জন্য আমি)। সুতরাং যদি এটি অন্য কাউকে সহায়তা করে তবে আমি খুঁজে পেলাম যে সবচেয়ে সহজ উপায় হ'ল আইডেন্টিটিমডেলস.সি খোলা এবং অ্যাপ্লিকেশনডিবি কনটেক্সট ক্লাসে আপনার নতুন ডিবিসেট যুক্ত করুন।
SeanOB

45

সেখানে প্রায় বিভ্রান্তির অনেক IdentityDbContext , Stackoverflow একটি দ্রুত অনুসন্ধান এবং আপনি এই প্রশ্নগুলোর খুঁজে পাবেন:
" কেন Asp.Net পরিচয় IdentityDbContext একটি কালো বক্স?
যখন ভিসুয়াল স্টুডিও 2013 AspNet পরিচয় ব্যবহার আমি কিভাবে টেবিল নাম পরিবর্তন করতে পারি?
সনাক্তকরণের সাথে MyDbContext মার্জ করুনবিডি কনটেক্সট "

এই সমস্ত প্রশ্নের উত্তরের জন্য আমাদের বুঝতে হবে যে আইডেন্টিটিডিবি কনটেক্সট কেবলমাত্র ডিবি কনটেক্সট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত বর্গ। আইডেন্টিটিডিবি কনটেক্সট উত্সটি
একবার দেখে নেওয়া যাক :

/// <summary>
/// Base class for the Entity Framework database context used for identity.
/// </summary>
/// <typeparam name="TUser">The type of user objects.</typeparam>
/// <typeparam name="TRole">The type of role objects.</typeparam>
/// <typeparam name="TKey">The type of the primary key for users and roles.</typeparam>
/// <typeparam name="TUserClaim">The type of the user claim object.</typeparam>
/// <typeparam name="TUserRole">The type of the user role object.</typeparam>
/// <typeparam name="TUserLogin">The type of the user login object.</typeparam>
/// <typeparam name="TRoleClaim">The type of the role claim object.</typeparam>
/// <typeparam name="TUserToken">The type of the user token object.</typeparam>
public abstract class IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken> : DbContext
    where TUser : IdentityUser<TKey, TUserClaim, TUserRole, TUserLogin>
    where TRole : IdentityRole<TKey, TUserRole, TRoleClaim>
    where TKey : IEquatable<TKey>
    where TUserClaim : IdentityUserClaim<TKey>
    where TUserRole : IdentityUserRole<TKey>
    where TUserLogin : IdentityUserLogin<TKey>
    where TRoleClaim : IdentityRoleClaim<TKey>
    where TUserToken : IdentityUserToken<TKey>
{
    /// <summary>
    /// Initializes a new instance of <see cref="IdentityDbContext"/>.
    /// </summary>
    /// <param name="options">The options to be used by a <see cref="DbContext"/>.</param>
    public IdentityDbContext(DbContextOptions options) : base(options)
    { }

    /// <summary>
    /// Initializes a new instance of the <see cref="IdentityDbContext" /> class.
    /// </summary>
    protected IdentityDbContext()
    { }

    /// <summary>
    /// Gets or sets the <see cref="DbSet{TEntity}"/> of Users.
    /// </summary>
    public DbSet<TUser> Users { get; set; }

    /// <summary>
    /// Gets or sets the <see cref="DbSet{TEntity}"/> of User claims.
    /// </summary>
    public DbSet<TUserClaim> UserClaims { get; set; }

    /// <summary>
    /// Gets or sets the <see cref="DbSet{TEntity}"/> of User logins.
    /// </summary>
    public DbSet<TUserLogin> UserLogins { get; set; }

    /// <summary>
    /// Gets or sets the <see cref="DbSet{TEntity}"/> of User roles.
    /// </summary>
    public DbSet<TUserRole> UserRoles { get; set; }

    /// <summary>
    /// Gets or sets the <see cref="DbSet{TEntity}"/> of User tokens.
    /// </summary>
    public DbSet<TUserToken> UserTokens { get; set; }

    /// <summary>
    /// Gets or sets the <see cref="DbSet{TEntity}"/> of roles.
    /// </summary>
    public DbSet<TRole> Roles { get; set; }

    /// <summary>
    /// Gets or sets the <see cref="DbSet{TEntity}"/> of role claims.
    /// </summary>
    public DbSet<TRoleClaim> RoleClaims { get; set; }

    /// <summary>
    /// Configures the schema needed for the identity framework.
    /// </summary>
    /// <param name="builder">
    /// The builder being used to construct the model for this context.
    /// </param>
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<TUser>(b =>
        {
            b.HasKey(u => u.Id);
            b.HasIndex(u => u.NormalizedUserName).HasName("UserNameIndex").IsUnique();
            b.HasIndex(u => u.NormalizedEmail).HasName("EmailIndex");
            b.ToTable("AspNetUsers");
            b.Property(u => u.ConcurrencyStamp).IsConcurrencyToken();

            b.Property(u => u.UserName).HasMaxLength(256);
            b.Property(u => u.NormalizedUserName).HasMaxLength(256);
            b.Property(u => u.Email).HasMaxLength(256);
            b.Property(u => u.NormalizedEmail).HasMaxLength(256);
            b.HasMany(u => u.Claims).WithOne().HasForeignKey(uc => uc.UserId).IsRequired();
            b.HasMany(u => u.Logins).WithOne().HasForeignKey(ul => ul.UserId).IsRequired();
            b.HasMany(u => u.Roles).WithOne().HasForeignKey(ur => ur.UserId).IsRequired();
        });

        builder.Entity<TRole>(b =>
        {
            b.HasKey(r => r.Id);
            b.HasIndex(r => r.NormalizedName).HasName("RoleNameIndex");
            b.ToTable("AspNetRoles");
            b.Property(r => r.ConcurrencyStamp).IsConcurrencyToken();

            b.Property(u => u.Name).HasMaxLength(256);
            b.Property(u => u.NormalizedName).HasMaxLength(256);

            b.HasMany(r => r.Users).WithOne().HasForeignKey(ur => ur.RoleId).IsRequired();
            b.HasMany(r => r.Claims).WithOne().HasForeignKey(rc => rc.RoleId).IsRequired();
        });

        builder.Entity<TUserClaim>(b => 
        {
            b.HasKey(uc => uc.Id);
            b.ToTable("AspNetUserClaims");
        });

        builder.Entity<TRoleClaim>(b => 
        {
            b.HasKey(rc => rc.Id);
            b.ToTable("AspNetRoleClaims");
        });

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

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

        builder.Entity<TUserToken>(b => 
        {
            b.HasKey(l => new { l.UserId, l.LoginProvider, l.Name });
            b.ToTable("AspNetUserTokens");
        });
    }
}


উত্স কোডের ভিত্তিতে যদি আমরা আমাদের DbContext এর সাথে আইডেন্টিটিবিবি কনটেক্সট একত্রিত করতে চাই তবে আমাদের দুটি বিকল্প রয়েছে:

প্রথম বিকল্প:
একটি ডিবি কনটেক্সট তৈরি করুন যা আইডেন্টিটিডিবি কনটেক্সট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং ক্লাসে অ্যাক্সেস পেতে পারে।

   public class ApplicationDbContext 
    : IdentityDbContext
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

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

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

    // Add additional items here as needed
}


অতিরিক্ত নোট:

1) নিম্নোক্ত সমাধান সহ আমরা এসপ নেট পরিচয় ডিফল্ট টেবিলের নামগুলিও পরিবর্তন করতে পারি:

    public class ApplicationDbContext : IdentityDbContext
    {    
        public ApplicationDbContext(): base("DefaultConnection")
        {
        }

        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<IdentityUser>().ToTable("user");
            modelBuilder.Entity<ApplicationUser>().ToTable("user");

            modelBuilder.Entity<IdentityRole>().ToTable("role");
            modelBuilder.Entity<IdentityUserRole>().ToTable("userrole");
            modelBuilder.Entity<IdentityUserClaim>().ToTable("userclaim");
            modelBuilder.Entity<IdentityUserLogin>().ToTable("userlogin");
        }
    }

২) তদুপরি আমরা প্রতিটি শ্রেণি প্রসারিত করতে এবং 'আইডেন্টিটিউজার', 'আইডেন্টিটি রোল', ...

    public class ApplicationRole : IdentityRole<string, ApplicationUserRole>
{
    public ApplicationRole() 
    {
        this.Id = Guid.NewGuid().ToString();
    }

    public ApplicationRole(string name)
        : this()
    {
        this.Name = name;
    }

    // Add any custom Role properties/code here
}


// Must be expressed in terms of our custom types:
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
}

সময় বাঁচানোর জন্য আমরা সমস্ত শ্রেণি প্রসারিত করতে এস্পনেট আইডেন্টিটি ২.০ এক্সটেনসিবল প্রজেক্ট টেম্পলেট ব্যবহার করতে পারি ।

দ্বিতীয় বিকল্প:(প্রস্তাবিত নয়)
আমরা সমস্ত কোড নিজেরাই লিখলে আমাদের আসলে আইডেন্টিটিবিবি কনটেক্সট থেকে উত্তরাধিকারী হতে হবে না।
সুতরাং মূলত আমরা কেবল DbContext থেকে উত্তরাধিকারী হতে পারি এবং আইডেন্টিটিডিবি কনটেক্সট উত্স কোড থেকে আমাদের "অনমোডেলক্রিটিং (মডেলবিল্ডার নির্মাতা)" এর কাস্টমাইজড সংস্করণটি প্রয়োগ করতে পারি


2
@ মাইক-ডিভননি দুটি প্রসঙ্গের স্তরটি মার্জ করার বিষয়ে এখানে আপনার উত্তর দিয়েছেন, আশা করি এটি সহায়তা করবে।
অরবন্দ

1
ধন্যবাদ অরবন্দ, আমি এটিকে মিস করেছি এবং অদ্ভুতভাবে আবার বিষয়টি দেখার সময় 1.5 বছর পরে এটি পেরেছি st :)
মাইক ডিভেন্নি

9

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


দ্রষ্টব্য : এটি লক্ষ্য করা উচিত যে আপনি Guid'sআপনার কীগুলির জন্য ব্যবহার করতে পারবেন না । এটি কারণ হুডের নীচে তারা একটি Structএবং এর মতো কোনও আনবক্সিং নেই যা জেনেরিক <TKey>প্যারামিটার থেকে তাদের রূপান্তর করতে দেয় ।

শ্রেণীর পছন্দগুলি পছন্দ:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, CustomRole, string, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
    #region <Constructors>

    public ApplicationDbContext() : base(Settings.ConnectionString.Database.AdministrativeAccess)
    {
    }

    #endregion

    #region <Properties>

    //public DbSet<Case> Case { get; set; }

    #endregion

    #region <Methods>

    #region

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

        //modelBuilder.Configurations.Add(new ResourceConfiguration());
        //modelBuilder.Configurations.Add(new OperationsToRolesConfiguration());
    }

    #endregion

    #region

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

    #endregion

    #endregion
}

    public class ApplicationUser : IdentityUser<string, CustomUserLogin, CustomUserRole, CustomUserClaim>
    {
        #region <Constructors>

        public ApplicationUser()
        {
            Init();
        }

        #endregion

        #region <Properties>

        [Required]
        [StringLength(250)]
        public string FirstName { get; set; }

        [Required]
        [StringLength(250)]
        public string LastName { get; set; }

        #endregion

        #region <Methods>

        #region private

        private void Init()
        {
            Id = Guid.Empty.ToString();
        }

        #endregion

        #region public

        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, string> 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;
        }

        #endregion

        #endregion
    }

    public class CustomUserStore : UserStore<ApplicationUser, CustomRole, string, CustomUserLogin, CustomUserRole, CustomUserClaim>
    {
        #region <Constructors>

        public CustomUserStore(ApplicationDbContext context) : base(context)
        {
        }

        #endregion
    }

    public class CustomUserRole : IdentityUserRole<string>
    {
    }

    public class CustomUserLogin : IdentityUserLogin<string>
    {
    }

    public class CustomUserClaim : IdentityUserClaim<string> 
    { 
    }

    public class CustomRoleStore : RoleStore<CustomRole, string, CustomUserRole>
    {
        #region <Constructors>

        public CustomRoleStore(ApplicationDbContext context) : base(context)
        {
        } 

        #endregion
    }

    public class CustomRole : IdentityRole<string, CustomUserRole>
    {
        #region <Constructors>

        public CustomRole() { }
        public CustomRole(string name) 
        { 
            Name = name; 
        }

        #endregion
    }

8

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.