2010-09-23 27 views
8

Projemde Entity Framework 4 kullanıyorum. Çerçeve kendi bağlantı dizesi yarattı, yani benim web.config connectionStrings bölüm dosyası aşağıdaki görünüyor:Entity Framework - artık bağlantı dizesi

<connectionStrings> 
    <add name="ApplicationServices" connectionString="data source=localhost;user id=user;pwd=pass;initial catalog=VNK" providerName="System.Data.SqlClient" />  
    <add name="VNKEntities" connectionString="metadata=res://*/VNKModel.csdl|res://*/VNKModel.ssdl|res://*/VNKModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=VNK;User ID=user;Password=pass;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

ApplicationServices denilen ilk bağlantı dizesi benim orijinal biridir. Model oluşturulurken, VNKEntities olarak adlandırılan ikinci oluşturuldu. Ben oluşturulan * .edmx dosyayı işaretlendiğinde

buldum bu model aşağıda gösterilmiştir ile bağlantısı dizesi, başvuruda bulunuyor:

sorum nasıl VNKEntities kurtulabilirsiniz edilir
/// <summary> 
    /// Initializes a new VNKEntities object using the connection string found in the 'VNKEntities' section of the application configuration file. 
    /// </summary> 
    public VNKEntities() : base("name=VNKEntities", "VNKEntities") 
    { 
     this.ContextOptions.LazyLoadingEnabled = true; 
     OnContextCreated(); 
    } 

bağlantı dizgisi ve yalnızca benim modelimden referans alacağım ApplicationServices bırakın? Ben sadece bir veritabanı kullanıyorum çünkü veritabanı için yalnızca bir bağlantı dizesi olmasını istiyorum (name=VNKEntities yapıcı parametresi yerine name=ApplicationServices çalışmıyor).

Selamlar manuel sıradan bağlantı dizesi

  • manuel dan DbConnection oluşturmak

  • cevap

    3

    Bağlantıda kod oluşturabilseniz de, @gandjustas'ın işaret ettiği gibi (+1), bir bağlantı dizesinden veya EntityConnection'dan uzaklaşamazsınız. Bu, 'un aslında gereğinden fazla dolmaması nedeniyle oluşur. Evet, veritabanı bağlantı kısmı gereksiz ve @gandjustas bu fazlalığı nasıl kaldıracağınızı gösterdi. Ancak, varlık çerçeve bağlantı dizesi, aynı zamanda, tutmak istediğiniz bağlantı dizesinde bulunmayan, modeliniz hakkında bilgi de içerir. Bu model bilgilerin bir yerden gelmesi gerekiyor. Varlık çerçevesinin bağlantı dizesini ortadan kaldırmanız ve ObjectContext parametresi yapıcısını kullanmanız gerektiğinden, modele yapılan tüm başvurular elimine edilirdi.

    +0

    Sorunumun çözümü için neden @gandjustas tarafından verilen çözümü seçmem gerektiğini anlamamda yardımcı olan ayrıntılı açıklama için teşekkür ederiz. – jwaliszko

    1

    Aynı problem vardı. Aşağıdaki yolu kullanarak çözdüm:

    İki edmx dosyası oluşturdum, ancak ikinci edmx dosyası oluşturulurken, yapılandırma dosyasında kaydedilecek bağlantı dizesini yok saydım. Bu şekilde, yapılandırma dosyam yalnızca bir Bağlantı dizgisini taşıyacaktır. Sonra benim bağlantı dizesinde aşağıdaki satırları modifiye: "res: // * /" ile: "//model1.csdl res" ve bir cazibe gibi çalışır

    <add name="MyDbContext" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=mydb;persist security info=True;user id=myuser;password=password;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
    

    Sadece değiştirin.

    Sen gibi DBContext sınıfının yapıcısı bu bağlantı adını belirtebilirsiniz:

    public MyDbContext() : base("name=NameOfYourConnectionString") // Name of your connection string 
    { } 
    

    Not: Ben Entity Framework 5.0 kullanıyorum.

    1

    Ben (gandjustas ipuçları dayanarak) bu sorunu çözmek için yaptığımız tam uygulanmasını sağlayacağız. Ben aşağıdaki şekilde kullanılabilir bağlam için basit bir sarmalayıcı, yazdık:

    using (var wrapper = new ContextWrapper<VNKEntities>()) 
    { 
        // do your stuff based on wrapper.Context 
    } 
    

    Tip ContextWrapper basitçe sadece biraz başka bir şekilde inşa edilmiştir bağlamı sarar bir şablondur (sadece birini kullanarak bağlantı dizesi) ve daha sonra mülkiyete maruz bırakılır.

    <connectionStrings> 
        <add name="ApplicationServices" connectionString="data source=localhost;user id=user;pwd=pass;initial catalog=VNK;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />  
    </connectionStrings> 
    

    ve meta verileri: Bir bağlantı dizesi olabilir Yani şimdi

    internal class EntityConnectionManager : IDisposable 
    { 
        private DbConnection _connection; 
        private EntityConnection _entityConnection; 
    
        private volatile bool _disposed; 
    
        public EntityConnectionManager() 
        { 
         var workspace = new MetadataWorkspace(Setting.MetadataWorkspacePaths.Split('|'), new[] { Assembly.ReflectionOnlyLoad(Setting.MetadataAssemblyNameToConsider) }); 
    
         _connection = new SqlConnection(Setting.ConnectionString); 
         _entityConnection = new EntityConnection(workspace, _connection); 
         _disposed = false; 
        } 
    
        public EntityConnection Connection 
        { 
         get { return _entityConnection; } 
        } 
    
        public void Dispose() 
        { 
         Dispose(true); 
         GC.SuppressFinalize(this); 
        } 
    
        protected virtual void Dispose(bool disposing) 
        { 
         if (!_disposed) 
         { 
          if (disposing) 
          { 
           if (_connection != null) 
           { 
            _connection.Dispose(); 
            _connection = null; 
           } 
           if (_entityConnection != null) 
           { 
            _entityConnection.Dispose(); 
            _entityConnection = null; 
           } 
          } 
         } 
         _disposed = true; 
        } 
    } 
    

    : Sen EntityConnectionManager adlı özel sınıfın kullanımını görebilirsiniz

    public class ContextWrapper<TContext> : IDisposable 
        where TContext : ObjectContext 
    { 
        private TContext _context; 
        private EntityConnectionManager _manager; 
        private bool _disposed; 
    
        public ContextWrapper() 
         : this(true) 
        { 
        } 
    
        public ContextWrapper(bool lazyLoadingEnabled) 
        { 
         _disposed = false; 
         _manager = new EntityConnectionManager(); 
         _context = (TContext)Activator.CreateInstance(typeof(TContext), _manager.Connection); 
         _context.ContextOptions.LazyLoadingEnabled = lazyLoadingEnabled; 
        } 
    
        ~ContextWrapper() 
        { 
         Dispose(false); 
        } 
    
        public TContext Context 
        { 
         get { return _context; } 
        } 
    
        public void Dispose() 
        { 
         Dispose(true); 
         GC.SuppressFinalize(this); 
    
        } 
    
        protected virtual void Dispose(bool disposing) 
        { 
         if (!_disposed) 
         { 
          if (disposing) 
          { 
           if (_manager != null) 
           { 
            _manager.Dispose(); 
            _manager = null; 
           } 
           var ctx = _context as IDisposable; 
           if (ctx != null) 
           { 
            ctx.Dispose(); 
            _context = null; 
           } 
          } 
         } 
         _disposed = true; 
        } 
    } 
    

    : Its iç uygulama altına yerleştirilirse uygulama ayarları bölümünde tanımlanmıştır (ikinci anahtar, etki alanı modelinizin depolandığı derlemeyi işaret eder):

    Sadece yapılandırma dosyasından ayarları çıkarır olarak tip Setting için

    mantık

    <appSettings> 
        <add key="MetadataWorkspacePaths" value="res://*/VNKModel.csdl|res://*/VNKModel.ssdl|res://*/VNKModel.msl" /> 
        <add key="MetadataAssemblyNameToConsider" value="VNK.Models" /> 
    </appSettings> 
    
    , basittir.