অটোটি ফ্রেমওয়ার্ক কোর-এ ডাটাবেস তৈরি করুন


103

আমার অ্যাপ্লিকেশনটি .NET কোরে পোর্ট করা হচ্ছে এসকিউএলাইট সহ নতুন ইএফ কোর ব্যবহার করবে। অ্যাপটি প্রথম চালিত হলে আমি স্বয়ংক্রিয়ভাবে ডাটাবেস এবং টেবিল কাঠামো তৈরি করতে চাই। EF কোর ডকুমেন্টেশন অনুসারে ম্যানুয়াল কমান্ড ব্যবহার করে এটি করা হয়

dotnet ef migrations add MyFirstMigration

dotnet ef database update

তবে আমি চাই না যে শেষ ব্যবহারকারী এই কমান্ডগুলি প্রবেশ করুক এবং অ্যাপটি প্রথম ব্যবহারের জন্য ডেটাবেস তৈরি এবং সেটআপ করতে পছন্দ করবে। EF 6 এর জন্য কার্যকারিতা রয়েছে

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

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

আমি কি এখানে কিছু মিস করছি বা স্বয়ংক্রিয়ভাবে টেবিল ফাংশনটি EF কোরটিতে অনুপস্থিত রয়েছে?

উত্তর:


151

আপনি যদি মাইগ্রেশনগুলি তৈরি করে থাকেন তবে আপনি স্টার্টআপ.কে সেগুলি নিম্নলিখিত হিসাবে কার্যকর করতে পারেন ।

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
      using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
      {
            var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            context.Database.Migrate();
      }

      ...

এটি আপনার যুক্ত মাইগ্রেশন ব্যবহার করে ডাটাবেস এবং সারণী তৈরি করবে।

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

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
      using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
      {
            var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            context.Database.EnsureCreated();
      }

      ...

পরিবর্তে.

আপনার ডাটাবেসটি তৈরি হয়েছে তা নিশ্চিত করার আগে আপনার যদি মুছে ফেলা প্রয়োজন, কল করুন:

            context.Database.EnsureDeleted();

ফোন করার ঠিক আগে EnsureCreated()

এর থেকে রূপান্তর: http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html?hightlight=entity


4
আমি ইএফ-তে এখনও বেশ নতুন, আমি ক্লাসগুলি তৈরি করেছিলাম যেগুলি EF 6 কোড ব্যবহার করে ডেটা স্ট্রাকচারকে সংজ্ঞায়িত করে প্রথমে একটি বর্তমান ডাটাবেস ফাইল ব্যবহার করে ভিজ্যুয়াল স্টুডিও থেকে "ডাটাবেস থেকে তৈরি" তৈরি করে। আমি তখন এগুলিকে নতুন ডটনেট কোর ভিএস সলিউশনে কাট / পেস্ট করেছি - সুতরাং আমি অনুমান করি যে এগুলি স্থানান্তর নয়। তার মানে কি উপরের কোডটি ব্যবহার করার আগে আমাকে একটি মাইগ্রেশন ফাইল তৈরি করতে হবে?
ডানডব

4
গালাগাল প্রতিবেদন দুঃখিত, আমি একটি ভুল আমার উত্তর এ, করেনি যদি মাইগ্রেশন ব্যবহার করছেন না, কমান্ড context.Database.EnsureCreated () / EnsureDeleted (), আরও বিস্তারিত ব্যবহার করতে পারেন blogs.msdn.microsoft.com/dotnet/2016 /
রিকার্ডো ফন্টানা

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

35

আমার উত্তর রিকার্ডোর জবাবের সাথে খুব মিল, তবে আমি অনুভব করি যে আমার দৃষ্টিভঙ্গি কিছুটা সহজবোধ্য কারণ কেবল তাঁর usingকার্যক্রমে এতটা চলছে যে আমি ঠিক জানি না যে এটি নিচের স্তরে ঠিক কীভাবে কাজ করে।

সুতরাং যারা আপনার জন্য একটি সহজ এবং পরিষ্কার সমাধান চান যা আপনার জন্য একটি ডাটাবেস তৈরি করে যেখানে আপনি ঠিক জানেন কী হুডের নীচে কী ঘটছে, এটি আপনার জন্য:

public Startup(IHostingEnvironment env)
{
    using (var client = new TargetsContext())
    {
        client.Database.EnsureCreated();
    }
}

এটির বেশিরভাগ অর্থ হ'ল DbContextআপনি যেটি তৈরি করেছেন তার মধ্যে (এই ক্ষেত্রে আমার বলা হয় TargetsContext), আপনি DbContextক্লাসে সংজ্ঞায়িত টেবিলগুলি যখন আপনার অ্যাপ্লিকেশনটিতে স্টার্টআপ.সিগুলি চালিত হয় তখন তা নিশ্চিত করতে একটি উদাহরণ ব্যবহার করতে পারেন ।


11
এখান থেকে প্রাপ্ত একটি তথ্য যেমন : EnsureCreatedপুরোপুরি মাইগ্রেশনকে বাইপাস করে এবং কেবল আপনার জন্য স্কিমা তৈরি করে, আপনি এটিকে মাইগ্রেশনের সাথে মিশতে পারবেন না। EnsureCreatedটেস্টিং বা দ্রুত প্রোটোটাইপিংয়ের জন্য ডিজাইন করা হয়েছে যেখানে আপনি প্রতিবার ডাটাবেস বাদ এবং পুনরায় তৈরি করার ক্ষেত্রে ঠিক আছেন। আপনি যদি মাইগ্রেশন ব্যবহার করছেন এবং এগুলি অ্যাপ্লিকেশন শুরুতে স্বয়ংক্রিয়ভাবে প্রয়োগ করতে চান তবে আপনি context.Database.Migrate()পরিবর্তে ব্যবহার করতে পারেন ।
থমাস স্নিটার

এটি আমার বিভ্রান্তির জবাব দেয় যে আমার সংযোগের স্ট্রিং কেন কাজ করছে না ... :( সুতরাং ডাটাবেস স্বয়ংক্রিয়ভাবে তৈরি হয় নি যে আপনাকে অবশ্যই ডেটাবেস নির্দিষ্ট করতে হবে ns এক্স_এক্স
পাম্পি

কেবলমাত্র এটি লক্ষ করতে চেয়েছিলাম যে আমি এটি আমার স্টার্টআপ ফাইলটিতে আটকানোর চেষ্টা করেছি এবং ভিএস2019 আমাকে অবহিত করেছে IHostingEnvironmentএবং এখন প্রস্তাবিত বিকল্পটি Microsoft.AspNetCore.Hosting.IWebHostEnvironment
ctrl-z pls

18

আপনি যদি স্টার্টআপ.cs এ কনফিগার করার প্যারামিটার তালিকার মাধ্যমে প্রসঙ্গটি পান তবে আপনি পরিবর্তে এটি করতে পারেন:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,  LoggerFactory loggerFactory,
    ApplicationDbContext context)
 {
      context.Database.Migrate();
      ...

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

13

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

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateWebHostBuilder(args).Build();
        using (var serviceScope = host.Services.CreateScope())
        {
            var context = serviceScope.ServiceProvider.GetRequiredService<PersonContext>();
            context.Database.Migrate();
        }
        host.Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

7

আপনি যদি মাইগ্রেশন তৈরি না করে থাকেন তবে দুটি বিকল্প রয়েছে

অ্যাপ্লিকেশন থেকে 1 ডাটাবেস এবং সারণী তৈরি করুন প্রধান:

var context = services.GetRequiredService<YourRepository>();
context.Database.EnsureCreated();

ডাটাবেস ইতিমধ্যে বিদ্যমান থাকলে টেবিলগুলি তৈরি করুন:

var context = services.GetRequiredService<YourRepository>();
context.Database.EnsureCreated();
RelationalDatabaseCreator databaseCreator =
(RelationalDatabaseCreator)context.Database.GetService<IDatabaseCreator>();
databaseCreator.CreateTables();

বুবির উত্তরের জন্য ধন্যবাদ


4
আপনার সেবা কি?
মাইকেলমাও

সকল ডকুমেন্টেশন আমি বলার অপেক্ষা রাখে না "ব্যবহার করবেন না মাইগ্রেশন প্রায় শো পড়া করছি বড় চর্বি সতর্কবার্তা EnsureCreatedবা EnsureDeletedবা Database.Migrateব্যর্থ হবে"
mwilson
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.