2012-03-11 18 views
5

मैंने स्कीमा उत्पन्न करने के लिए कोड के पहले दृष्टिकोण का उपयोग करके वीएस -2010 पर एक सरल .net एमवीसी 3 ऐप लिखा था। जब मैं यह एक साझा उत्पादन सर्वर के लिए तैनात किए गए मैं निम्नलिखित त्रुटि मिली: [SqlException (0x80131904):। डाटाबेस अनुमति डेटाबेस 'गुरु' में से इनकार किया बनाएं]उत्पादन डेटाबेस में ईएफ कोड प्रथम ऐप्स को तैनात करना

यहाँ मेरी मॉडल कोड है:

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

namespace Bonappetit.Models 
{ 
public class MenuItem 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public decimal Price { get; set; } 
} 

public class MenuItemDBContext : DbContext 
{ 
    public DbSet<MenuItem> MenuItems { get; set; } 
} 
} 
यहाँ

namespace Bonappetit.Controllers 
{ 
public class MenuItemsController : Controller 
{ 
    private MenuItemDBContext db = new MenuItemDBContext(); 

    // 
    // GET: /MenuItems/ 

    public ViewResult Index() 
    { 
     return View(db.MenuItems.ToList()); 
    } 

    public ActionResult generateJSON() 
    { 
     return Json(db.MenuItems.ToList(), JsonRequestBehavior.AllowGet); 

    } 

और यहां उत्पादन डेटाबेस

<connectionStrings> 
    <add name="MenuItemDBContext" 
    connectionString="Data Source=localhost\sqlexpress;Initial Catalog=ptafhksz_bonappetit;User ID=ptafhksz_jalal;Password=345d654654Dfdgdfg" 
    providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> 
</connectionStrings> 
के लिए मेरे कनेक्शन स्ट्रिंग है: मेरी नियंत्रक कोड है

मैं एएसपीएनटी एमवीसी के लिए नया हूं - कृपया मुझे सलाह दें कि एक उत्पादन आधारित डीबी के खिलाफ मेरा ऐप कैसे चलाया जाए जहां मैं एसक्यूएल बना या ड्रॉप नहीं कर सकता।

धन्यवाद!

+2

कृपया ध्यान दें कि आपने कॉन्फ़िगरेशन में डीबी को पासवर्ड पोस्ट किया है। मुझे लगता है कि आपको अपना पासवर्ड बदलना चाहिए ... –

उत्तर

1

यहां समस्या आपके कोड होने के लिए आवश्यक नहीं है।

CREATE DATABASE permission denied in database 'master'

त्रुटि संदेश ऊपर समस्या है पता चलता है आपके क्रेडेंशियल्स है कि नए आइटम बनाने की क्षमता नहीं है के साथ डेटाबेस से कनेक्ट।

+0

सच है, लेकिन मुझे लगता है कि यह चाल है कि यह गलत डीबी से पूरी तरह से कनेक्ट करने का प्रयास कर रहा है। पढ़ने से, आपके पास सुरक्षा सेट अप ठीक से हो सकती है और आप app.config में लोकलहोस्ट का उपयोग कर रहे हैं, लेकिन सिस्टम SQLEXPRESS में डीबी को आजमाने और बनाने की इच्छा रखता है ... जो बिल्कुल कॉन्फ़िगर नहीं है। – beauXjames

5

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

ईएफ कोड प्रथम/माइग्रेशन को custom db initializer strategy के माध्यम से उत्पादन वातावरण में चलाते समय ऑटो-निर्माण या स्वत: माइग्रेट डेटाबेस नहीं बनाया जा सकता है।

public class ValidateDatabase<TContext> : IDatabaseInitializer<TContext> 
    where TContext : DbContext 
{ 
    public void InitializeDatabase(TContext context) 
    { 
    if (!context.Database.Exists()) 
    { 
     throw new ConfigurationException(
     "Database does not exist"); 
    } 
    else 
    { 
     if (!context.Database.CompatibleWithModel(true)) 
     { 
     throw new InvalidOperationException(
      "The database is not compatible with the entity model."); 
     } 
    } 
    } 
} 

अपने DbContext में एक स्थिर निर्माता के साथ इसे सक्षम करें:

static MyDbContext() 
{ 
    Database.SetInitializer(new ValidateDatabase<CarsContext>()); 
} 
+0

धन्यवाद एंड्रेस - कस्टम डीबी प्रारंभकर्ता मेरे कोड में कैसा दिखता है? – user1261952

+0

जिसे मैंने लिंक किया है (ऊपर से चिपकाया गया है) जैसा काम करना चाहिए। –

+0

यह एंड्रेस काम नहीं करता - दर्द होने के लिए खेद है। क्या आपके पास स्काइप या जीमेल में लॉग इन करने के लिए 5 मिनट हैं? मैं अपनी स्क्रीन को आपके साथ साझा कर सकता हूं - इस तरह आपको मेरी अन्य सेटिंग्स को देखने का मौका मिलेगा। मैं ऐप के दूसरे हिस्से में बेवकूफ कुछ कर रहा था। धन्यवाद। – user1261952

2

आप अपने होस्टिंग कंपनी के एसक्यूएल सर्वर अंतरिक्ष पर व्यवस्थापक विशेषाधिकार नहीं है। यही कारण है कि आप ड्रॉप करने में सक्षम हो सकते हैं लेकिन जब ईएफ क्रिएट डाटाबेस चरण का प्रयास करता है तो असफल हो जाएगा। डाटाबेस प्रारंभिकरण उत्पादन अनुप्रयोगों पर सबसे अच्छा नहीं किया जाता है।

  1. यदि आपके पास पूर्ण पैमाने पर SQL सर्वर (एक्सप्रेस नहीं) पर आपके dev तक पहुंच है और किया है। बस बैकअप लें, इसे अपलोड करें और अपने होस्टिंग SQL सर्वर स्पेस पर पुनर्स्थापित करें।

  2. यदि आपने SQLExpress का उपयोग किया है, तो आपको अपने डेटा पर प्रत्येक ऑब्जेक्ट की SQL स्क्रिप्ट जेनरेट करना होगा और इसे SQL सर्वर स्पेस होस्टिंग पर चलाएं। वैकल्पिक रूप से, यदि आप अपने डेटाबेस को एक पूर्ण पैमाने पर SQL सर्वर पर पुन: बना सकते हैं जो आपको स्क्रिप्ट उत्पन्न करने और निष्पादित करने का कार्य सहेज लेगा।

  3. अपने कोड के डेटाबेस प्रारंभिक भागों को टिप्पणी करें।

  4. अपने होस्टिंग स्थान पर अपना स्रोत कोड तैनात करें।
  5. अपने होस्टिंग के SQL सर्वर पर डेटाबेस प्रति को इंगित करने के लिए कनेक्शन स्ट्रिंग को संशोधित करें।
  6. प्रार्थना करें कि सब कुछ सुचारू रूप से चलता है। :) यदि नहीं, तो इस विचार पर विचार करें कि एक बार जब आप ऐप चला रहे हैं तो आपने वेबपै/ईएफ परियोजना परिनियोजन पर खुद को एक श्वेत-बेल्ट अर्जित किया है।
संबंधित मुद्दे