10

कॉन्फ़िगरेशन के साथ क्लास लाइब्रेरी में इकाई फ्रेमवर्क 7 माइग्रेशन मचान एक एएसपी.NET 5 क्लास लाइब्रेरी में रहने वाले ईएफ 7 मॉडल में माइग्रेशन जोड़ने का प्रयास कर रहा है। dnx . ef migration add mymigration चलाते समय विभिन्न परिणामों के साथ विफल रहता है, इस पर निर्भर करता है कि मैं किस प्रोजेक्ट को चलाता हूं।कॉन्फ़िगरेशन

यदि मैं इसे मुख्य प्रोजेक्ट के फ़ोल्डर में चलाता हूं, तो यह DbContext का पता नहीं लगा सकता है, यह समझ में आता है क्योंकि DbContext साझा प्रोजेक्ट में है और ef आदेश संभावित रूप से निर्भरताओं की परवाह नहीं करते हैं।

यदि मैं इसे साझा प्रोजेक्ट के फ़ोल्डर में चलाता हूं, तो उसे startup.cs में निर्दिष्ट कनेक्शन स्ट्रिंग तक पहुंच नहीं है। मैंने this जैसे प्रश्नों से प्राप्त किया है कि यह साझा प्रोजेक्ट से काम करता है यदि आप DbContext की OnConfiguring विधि में कनेक्शन स्ट्रिंग निर्दिष्ट करते हैं, लेकिन मैं वास्तव में कॉन्फ़िगरेशन से यह कोड अलग रखना चाहता हूं।

मैं ईएफ 7 भंडार में कुछ issue logs में आया, जिसमें उल्लेख किया गया है कि उन्होंने एक परियोजना और संदर्भ निर्दिष्ट करने के लिए कमांड लाइन विकल्प लागू किए हैं लेकिन कोई उदाहरण नहीं हैं और मैं यह नहीं समझ सकता कि स्रोत कोड को देखने से इसका उपयोग कैसे किया जाए प्रतिबद्ध इतिहास।

+0

आप अपनी कनेक्शन स्ट्रिंग कहां संग्रहीत कर रहे हैं? क्या यह Startup.cs में कोडित है? –

+0

यह config.json में है और कॉन्फ़िगरेशन के साथ लोड किया गया है AddDbContext CuddleBunny

उत्तर

9

यहां एक ऐसा दृष्टिकोण है जो आपके लिए काम कर सकता है।

यदि मैं इसे साझा प्रोजेक्ट के फ़ोल्डर में चलाता हूं, तो इसे startup.cs में निर्दिष्ट कनेक्शन स्ट्रिंग तक पहुंच नहीं है।

Startup.cs

मैं यह सोचते हैं रहा है कि अपने Startup.cs में, आप Configuration तक पहुँचने के बजाय कठिन द्वारा यह कोडिंग से कनेक्शन स्ट्रिंग निर्दिष्ट कर रहे हैं। इसके अलावा, मुझे लगता है कि आपके Startup.cs फ़ाइल के निर्माता में, आप कुछ स्रोतों से कॉन्फ़िगरेशन सेट अप कर रहे हैं। दूसरे शब्दों में, अपने Startup.cs कुछ इस तरह दिख सकता है:

public class Startup 
{ 
    public IConfiguration Config { get; set; } 

    public Startup(IHostingEnvironment env) 
    { 
     var config = new Configuration() 
      .AddJsonFile("config.json") 
      .AddUserSecrets() 
      .AddEnvironmentVariables(); 

     Config = config; 
    } 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<MyDbContext>(options => 
      { 
       options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]); 
      }); 
    } 

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider) 
    { 
     var db = serviceProvider.GetRequiredService<MyDbContext>(); 
     db.Database.AsSqlServer().EnsureCreated(); 

     app.Run(async (context) => 
     { 
      await context.Response.WriteAsync("Hello World!"); 
     }); 
    } 
} 

config.json

इसके अलावा, मैं यह सोचते कर रहा हूँ कि आप जड़ में एक config.json लिए कनेक्शन स्ट्रिंग जोड़ रहे हैं अपनी परियोजना के (या है कि आप इसे उपयोगकर्ता रहस्य या पर्यावरण चर के माध्यम से जोड़ने।) आपका config.json कुछ इस तरह दिख सकता है:

{ 
    "ConnectionStrings": { 
    "MyDbContext": "Some-Connection-String" 
    } 
} 

आप इसे उस तरह से नहीं कर रहे हैं, यह कोशिश कर रहा लायक हो सकता है ।

मैं अगर तुम DbContext की OnConfiguring विधि में कनेक्शन स्ट्रिंग निर्दिष्ट लेकिन मैं वास्तव में इस कोड विन्यास से अलग रखना चाहते हैं यह है कि यह साझा परियोजना से काम करता है जैसे प्रश्नों से बटोरा है।

DbContext

मेरी मान्यताओं से ऊपर सही हैं, तो आप एक ही पैटर्न है कि आप Startup वर्ग में प्रयोग किया जाता का उपयोग करके DbContext में कनेक्शन स्ट्रिंग पहुँच सकते हैं। यही है, DbContext कन्स्ट्रक्टर में, IConfiguration सेटअप करें। फिर, OnConfiguring में, कनेक्शन स्ट्रिंग तक पहुंचें।यह कुछ इस तरह दिख सकता है:

public class MyDbContext : DbContext 
{ 
    protected override void OnModelCreating(ModelBuilder builder) 
    { 
     builder.Entity<SomeModel>().Key(e => e.Id); 
     base.OnModelCreating(builder); 
    } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     var connString = Config["ConnectionStrings:MyDbContext"]; 
     optionsBuilder.UseSqlServer(connString); 
    } 

    public IConfiguration Config { get; set; } 

    public MyDbContext() 
    { 
     var config = new Configuration() 
      .AddJsonFile("config.json") 
      .AddEnvironmentVariables(); 

     Config = config; 
    } 
} 

परियोजना संरचना

आप निश्चित रूप से करेंगे अपने साझा परियोजनाओं की जड़ में एक config.json फ़ाइल के लिए भी फ़ोल्डर की जरूरत है। तो, अपनी परियोजनाओं को 'संरचना कुछ इस तरह दिखाई दे सकता है:

SharedDataContext 
    Migrations 
    config.json 
    project.json 

WebApp 
    config.json 
    project.json 
    Startup.cs 

ऊपर में, दोनों config.json फ़ाइलों को एक कनेक्शन स्ट्रिंग DbContext के लिए सेटिंग होते हैं।

कुछ विचार

आप config.json कनेक्शन स्ट्रिंग सामान डुप्लिकेट पसंद नहीं है, तो आप पर्यावरण चर या उपयोगकर्ता रहस्य बजाय उपयोग कर सकते हैं।

+0

यह पूरे नामस्थान को मुख्य प्रोजेक्ट में स्थानांतरित करने से कहीं अधिक स्वीकार्य कामकाज है। प्रवासन ऐड सही काम करता है, लागू होने के साथ एक टक्कर मारता है: चूंकि मैं एक कस्टम 'डेटा डायरेक्टरी' का उपयोग कर रहा था, मुझे कुछ संदर्भ पहचान करना पड़ा। जब कमांड लाइन 'पथ। गेटफुलपैथ (".. \\ मेनप्रोजेक्ट") से चलाया जाता है, तो मुझे "सी: \ पथ \ टू \ माय \ प्रोजेक्ट \ src \ MainProject" देता है, लेकिन वास्तविक प्रोजेक्ट चलाते समय मुझे "सी: \ प्रोग्राम फ़ाइलें (x86) \ MainProject "इसके बजाए! इसलिए मैंने यह देखने के लिए एक चेक जोड़ा कि पथ में "src" टेक्स्ट है या नहीं और यह अब काम करता है। यह उत्पादन के लिए बंदरगाह भी होना चाहिए क्योंकि पर्यावरण के वार्स इसे सब ओवरराइट करेंगे। – CuddleBunny

+0

मैं इसे तब तक उत्तर के रूप में स्वीकार करूंगा जब तक कम हैकी कुछ नहीं आती। – CuddleBunny

+0

@CuddleBunny मुझे खुशी है कि यह काम करता है और कुछ कम हैकी देखने के लिए उत्सुक हूं। शायद ईएफ टीम के किसी व्यक्ति ने जवाब दिया होगा। बीटा 5 के साथ –

संबंधित मुद्दे