实体框架的连接字符串

Ric*_*ico 27 c# entity-framework machine.config

我想在Silverlight中的多个实体之间共享相同的数据库信息..但我希望连接字符串被命名为xyz并让每个人都从machine.config访问该连接字符串...

实体的元数据部分将是不同的,因为我没有将实体命名为相同的..

我可以在该元数据部分放置多个实体吗?

这是一个例子..我想使用这个连接字符串,但请注意我在元数据部分放了多个实体.

基本上我想要这个连接字符串

<add name="XYZ" connectionString="metadata=res://*/ModEntity.csdl|res://*/ModEntity.ssdl|res://*/ModEntity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SomeServer;Initial Catalog=SomeCatalog;Persist Security Info=True;User ID=Entity;Password=SomePassword;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

而这个连接字符串

 <add name="XYZ" connectionString="metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SOMESERVER;Initial Catalog=SOMECATALOG;Persist Security Info=True;User ID=Entity;Password=Entity;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

制作此连接字符串

<add name="XYZ" connectionString="metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.msl|res://*/ModEntity.csdl|res://*/ModEntity.ssdl|res://*/ModEntity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SOMESERVER;Initial Catalog=SOMECATALOG;Persist Security Info=True;User ID=Entity;Password=SOMEPASSWORD;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

但它根本行不通.这两个项目都无法连接到它.

string encConnection = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString;
Type contextType = typeof(test_Entities);
object objContext = Activator.CreateInstance(contextType, encConnection);
return objContext as test_Entities; 
Run Code Online (Sandbox Code Playgroud)

Str*_*ior 42

不幸的是,将多个实体上下文组合成单个命名连接是不可能的.如果要使用.config文件中的命名连接字符串来定义实体框架连接,则每个连接都必须具有不同的名称.按照惯例,该名称通常是上下文的名称:

<add name="ModEntity" connectionString="metadata=res://*/ModEntity.csdl|res://*/ModEntity.ssdl|res://*/ModEntity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SomeServer;Initial Catalog=SomeCatalog;Persist Security Info=True;User ID=Entity;Password=SomePassword;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
<add name="Entity" connectionString="metadata=res://*/Entity.csdl|res://*/Entity.ssdl|res://*/Entity.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=SOMESERVER;Initial Catalog=SOMECATALOG;Persist Security Info=True;User ID=Entity;Password=Entity;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

但是,如果最终出现命名空间冲突,则可以使用所需的任何名称,并在生成时将其正确地传递给上下文:

var context = new Entity("EntityV2");
Run Code Online (Sandbox Code Playgroud)

显然,如果您使用工厂或依赖注入来生成上下文,则此策略最有效.

另一种选择是以编程方式生成每个上下文的整个连接字符串,然后将整个字符串传递给构造函数(而不仅仅是名称).

// Get "Data Source=SomeServer..."
var innerConnectionString = GetInnerConnectionStringFromMachinConfig();
// Build the Entity Framework connection string.
var connectionString = CreateEntityConnectionString("Entity", innerConnectionString);
var context = new EntityContext(connectionString);
Run Code Online (Sandbox Code Playgroud)

这样的事情怎么样:

Type contextType = typeof(test_Entities);
string innerConnectionString = ConfigurationManager.ConnectionStrings["Inner"].ConnectionString;
string entConnection = 
    string.Format(
        "metadata=res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl;provider=System.Data.SqlClient;provider connection string=\"{1}\"",
        contextType.Name,
        innerConnectionString);
object objContext = Activator.CreateInstance(contextType, entConnection);
return objContext as test_Entities; 
Run Code Online (Sandbox Code Playgroud)

...在你的machine.config中有以下内容:

<add name="Inner" connectionString="Data Source=SomeServer;Initial Catalog=SomeCatalog;Persist Security Info=True;User ID=Entity;Password=SomePassword;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

这样,您可以为计算机上每个项目中的每个上下文使用单个连接字符串.


Mic*_*ana 5

您可以使用带有作用域systemConfig表的配置数据库,而不是使用配置文件,并在那里添加所有设置.

CREATE TABLE [dbo].[SystemConfig]  
    (  
      [Id] [int] IDENTITY(1, 1)  
                 NOT NULL ,  
      [AppName] [varchar](128) NULL ,  
      [ScopeName] [varchar](128) NOT NULL ,  
      [Key] [varchar](256) NOT NULL ,  
      [Value] [varchar](MAX) NOT NULL ,  
      CONSTRAINT [PK_SystemConfig_ID] PRIMARY KEY NONCLUSTERED ( [Id] ASC )  
        WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,  
               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,  
               ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]  
    )  
ON  [PRIMARY]  

GO  

SET ANSI_PADDING OFF  
GO  

ALTER TABLE [dbo].[SystemConfig] ADD  CONSTRAINT [DF_SystemConfig_ScopeName]  DEFAULT ('SystemConfig') FOR [ScopeName]  
GO 
Run Code Online (Sandbox Code Playgroud)

使用这样的配置表,您可以创建如下行: 在此输入图像描述

然后从您的应用程序dal(s)包装EF,您可以轻松检索范围配置.
如果您没有使用dal并直接使用EF在线路中工作,则可以从SystemConfig表中创建一个实体,并根据您所使用的应用程序使用该值.