6 c# orm entity-framework ef-code-first
这是我的第一个问题,我知道在搜索之前我应该搜索一下,我确信我已经完成了搜索,但是我找不到合适的信息.
我使用代码优先的方法来实现我的Context和我的模型,所以我有一个简单的上下文,如:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public partial class MultipleContext : DbContext
{
public MariaDBContext(string connection) : base(connection)
{
//Database.SetInitializer<MultipleDBContext>(new MariaDbInitializer());
}
public virtual DbSet<Test> Tests { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Test>().ToTable("test")
.HasKey(e => e.ID);
}
}
Run Code Online (Sandbox Code Playgroud)
和我的模特:
public partial class Test
{
public int ID { get; set; }
public string Name { get; set; }
public string Family { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有两个connectionstrings如下:
<connectionStrings>
<add name="MariaDBContext" connectionString="server=127.0.0.1;user id=root;password=xx;database=sb1" providerName="MySql.Data.MySqlClient" />
<add name="SqlDBContext" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=db1" providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
和我的EF配置:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</providers>
</entityFramework>
Run Code Online (Sandbox Code Playgroud)
我想通过改变来改写不同的Db ConnectionString:
MultipleDBContext context = new MultipleDBContext(System.Configuration.ConfigurationManager.ConnectionStrings["MariaDBContext"].ToString());
var xx = context.Tests.Where(x => x.ID > 0).ToList();
context.Tests.Add(new Test()
{
Name = "name",
Family = ""
});
context.SaveChanges();
xx = context.Tests.Where(x => x.ID > 0).ToList();
//Use sql connection
MultipleDBContext sqlContext = new MultipleDBContext (System.Configuration.ConfigurationManager.ConnectionStrings["SqlDBContext"].ToString());
var sqlTest = sqlContext.Tests.Where(x => x.ID > 0).ToList();
sqlContext.Tests.Add(new Test()
{
Name = "name_" + DateTime.Now.Ticks.ToString(),
Family = "family_" + DateTime.Now.Ticks.ToString(),
});
sqlContext.SaveChanges();
sqlTest = sqlContext.Tests.Where(x => x.ID > 0).ToList();
Run Code Online (Sandbox Code Playgroud)
第一个context工作正常但sqlcontext得到以下异常:
EntityFramework.dll中发生未处理的"System.NullReferenceException"类型异常附加信息:对象引用未设置为对象的实例
但如果我删除DbConfigurationType装饰然后第二个sqlContext工作正常第一个给下面的例外:
EntityFramework.dll中出现未处理的"System.Data.SqlClient.SqlException"类型异常附加信息:用户"root"登录失败.
我知道这是因为DbConfigurationType它可以在应用程序中定义启动或装饰Context或在配置文件中定义....
但我怎么能有这个(多个connectionstrings和一个上下文)?
我很确定这是因为配置文件中的配置(多个提供程序),
据我所知,您应该在运行时更改相关数据库的提供程序。
因此,您的配置文件似乎是为MySql提供者配置的:
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</providers>
Run Code Online (Sandbox Code Playgroud)
所以你必须connectionstring像下面这样定义提供者(仅用于示例):
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
</providers>
Run Code Online (Sandbox Code Playgroud)
但通过上面的配置,问题不会消失,因为还有一些其他的提示和技巧可以做到这一点,例如schema 不同数据库中的不同,不同的属性[DbColumn(msSqlName: "Id", oracleName: "ID", postgreSqlName: "id")]等......
因此,根据我的经验,每个数据库都有单独的上下文会更好,但最后有一些有用的链接可以帮助您解决问题。
第一个是实体框架多数据库支持和这个
除了您应该知道的任何事情之外,每个单个上下文是否有多个数据库是个好主意,这个问题之前在这里讨论过。
希望这个答案对您有帮助。
| 归档时间: |
|
| 查看次数: |
567 次 |
| 最近记录: |