C# DbModelBuilder并发问题
我写的一些代码有一个奇怪的并发问题。你们会问的第一件事是为什么我要使用CF和DbModelBuilder。。。嗯,我有一种情况,我可以有n个数据库,它们都是相同的,我必须保持数据的分离。我使用CF来防止大规模的模型生成问题,因为多个开发人员用他们的GUI来展示我的模型。唉,这是我正在做的基本代码 这两个控制台写入线永远不应该被击中,但它们确实被击中了 你能试试这个,让我知道问题出在哪里吗 这是测试线束控制台应用程序:C# DbModelBuilder并发问题,c#,multithreading,entity-framework,thread-safety,C#,Multithreading,Entity Framework,Thread Safety,我写的一些代码有一个奇怪的并发问题。你们会问的第一件事是为什么我要使用CF和DbModelBuilder。。。嗯,我有一种情况,我可以有n个数据库,它们都是相同的,我必须保持数据的分离。我使用CF来防止大规模的模型生成问题,因为多个开发人员用他们的GUI来展示我的模型。唉,这是我正在做的基本代码 这两个控制台写入线永远不应该被击中,但它们确实被击中了 你能试试这个,让我知道问题出在哪里吗 这是测试线束控制台应用程序: class Program { static void Main(st
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
var workerObject = new Worker();
var workerThread = new Thread(workerObject.DoWork);
workerThread.Start();
}
}
}
public class Worker
{
public void DoWork()
{
var connections = new List<KeyValuePair<string, DynamicDb>>
{
new KeyValuePair<string, DynamicDb>("db1", new MyDynamicEntityLayer("db1").DynamicDb()),
new KeyValuePair<string, DynamicDb>("db2", new MyDynamicEntityLayer("db2").DynamicDb())
};
foreach (var db in connections)
{
if (db.Key == "db1" && db.Value.ConnectionString.Contains("db2"))
Console.WriteLine("THIS SHOULD NEVER HAPPEN!!! db1 : " + db.Value.ConnectionString);
if (db.Key == "db2" && db.Value.ConnectionString.Contains("db1"))
Console.WriteLine("THIS SHOULD NEVER HAPPEN!!! db2 : " + db.Value.ConnectionString);
}
}
}
类程序
{
静态void Main(字符串[]参数)
{
对于(int i=0;i<100;i++)
{
var workerObject=new Worker();
var workerThread=新线程(workerObject.DoWork);
workerThread.Start();
}
}
}
公社工人
{
公共工作
{
var connections=新列表
{
新的KeyValuePair(“db1”,新的MyDynamicEntityLayer(“db1”).DynamicDb()),
新的KeyValuePair(“db2”,新的MyDynamicTityLayer(“db2”).DynamicDb()
};
foreach(连接中的var db)
{
if(db.Key==“db1”&&db.Value.ConnectionString.Contains(“db2”))
Console.WriteLine(“这永远不会发生!!!db1:+db.Value.ConnectionString”);
if(db.Key==“db2”&&db.Value.ConnectionString.Contains(“db1”))
WriteLine(“这永远不会发生!!!db2:+db.Value.ConnectionString);
}
}
}
以下是实体类:
public class MyDynamicEntityLayer
{
public static string ConnectionString { get; set; }
public MyDynamicEntityLayer(string db = null)
{
MakeAConnectionString(db);
Database.SetInitializer<DynamicDb>(null);
}
public void MakeAConnectionString(string db)
{
var sqlBuilder = new SqlConnectionStringBuilder();
if (db == "db1")
{
sqlBuilder.DataSource = "MySqlServer";
sqlBuilder.InitialCatalog = "db1";
sqlBuilder.ConnectTimeout = 180;
sqlBuilder.IntegratedSecurity = true;
}
else
{
sqlBuilder.DataSource = "MySqlServer";
sqlBuilder.InitialCatalog = "db2";
sqlBuilder.ConnectTimeout = 180;
sqlBuilder.IntegratedSecurity = true;
}
ConnectionString = sqlBuilder.ToString();
}
public DynamicDb DynamicDb()
{
var builder = new DbModelBuilder(DbModelBuilderVersion.Latest);
TableMappingToBuilder(builder);
var compiled = builder.Build(Database.DefaultConnectionFactory.CreateConnection(ConnectionString)).Compile();
return new DynamicDb(compiled);
}
public void TableMappingToBuilder(DbModelBuilder builder)
{
builder.Configurations.Add(new EntityTypeConfiguration<ConcurrencyTest>());
builder.Entity<ConcurrencyTest>().ToTable("ConcurrencyTest", "dbo");
}
}
公共类MyDynamicLayer
{
公共静态字符串连接字符串{get;set;}
公共MyDynamicEntityLayer(字符串db=null)
{
makea连接字符串(db);
Database.SetInitializer(null);
}
public void MakeAConnectionString(字符串db)
{
var sqlBuilder=new SqlConnectionStringBuilder();
如果(db==“db1”)
{
sqlBuilder.DataSource=“MySqlServer”;
sqlBuilder.InitialCatalog=“db1”;
sqlBuilder.ConnectTimeout=180;
sqlBuilder.IntegratedSecurity=true;
}
其他的
{
sqlBuilder.DataSource=“MySqlServer”;
sqlBuilder.InitialCatalog=“db2”;
sqlBuilder.ConnectTimeout=180;
sqlBuilder.IntegratedSecurity=true;
}
ConnectionString=sqlBuilder.ToString();
}
公共动态CDB动态CDB()
{
var builder=newdbmodelbuilder(DbModelBuilderVersion.Latest);
TableMappingToBuilder(生成器);
var compiled=builder.Build(Database.DefaultConnectionFactory.CreateConnection(ConnectionString)).Compile();
返回新的动态CDB(已编译);
}
public void TableMappingToBuilder(DbModelBuilder builder)
{
Add(newentitytypeconfiguration());
builder.Entity().ToTable(“ConcurrencyTest”、“dbo”);
}
}
和我的DBCS上下文文件:
public class DynamicDb : DbContext
{
public string ConnectionString { get; set; }
public DynamicDb(DbCompiledModel model)
: base(MyDynamicEntityLayer.ConnectionString, model)
{
ConnectionString = MyDynamicEntityLayer.ConnectionString;
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 100;
}
public DbSet<ConcurrencyTest> ConcurrencyTests { get; set; }
}
public class ConcurrencyTest
{
public int ID { get; set; }
public string MyColumn { get; set; }
}
公共类动态cdb:DbContext
{
公共字符串连接字符串{get;set;}
公共动态数据库(DbCompiledModel模型)
:base(MyDynamicEntityLayer.ConnectionString,模型)
{
ConnectionString=MyDynamicEntityLayer.ConnectionString;
((IObjectContextAdapter)this).ObjectContext.CommandTimeout=100;
}
公共DbSet并发测试{get;set;}
}
公共类并发测试
{
公共int ID{get;set;}
公共字符串MyColumn{get;set;}
}
您的问题是:
public class MyDynamicEntityLayer
{
public static string ConnectionString { get; set; } // STATIC PROPERTY
...
}
所有工作线程共享存储在此属性中的单个值,并争取对其进行修改。什么并发问题?如果你有问题,你应该描述它,否则你的问题将被关闭。两个控制台writeline的不应该被击中。谢谢你寻找Ladislav。。。我在这里看过你的作品。你可能会很快发现这个问题!