多个DbContext修改同一张表测试
多个DbContext修改同一张表经测试是可行的。
UserStore和DepartmentStore都可以向SysLog表写入数据
用多个线程同时通过UserStore和DepartmentStore想SysLog表写入数据,数据能正确写入表中

实体代码:
public class Department
{
public String DeptId { get; set; }
public String DeptName { get; set; }
public String ParentId { get; set; } public DateTime? CreatedStamp { get; set; } public DateTime? UpdatedStamp { get; set; }
} public class SysLog
{
public SysLog() { Id = Guid.NewGuid().ToString(); }
/// <summary>
/// Id
/// </summary>
public String Id { get; set; }
/// <summary>
/// 参数
/// </summary>
public String Operator { get; set; }
/// <summary>
/// 信息
/// </summary>
public String Message { get; set; }
/// <summary>
/// 结果
/// </summary>
public String Result { get; set; }
/// <summary>
/// 类型
/// </summary>
public String Type { get; set; }
/// <summary>
/// 模组
/// </summary>
public String Module { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
}
public class User
{
public String Uid { get; set; }
public String Passwrod { get; set; }
public String Name { get; set; }
public String QQ { get; set; }
public String Email { get; set; }
public String Tel { get; set; }
public String MobilePhone { get; set; }
public String DeptId { get; set; } public DateTime? CreatedStamp { get; set; } public DateTime? UpdatedStamp { get; set; }
}
数据库映射
public class DepartmentMapping: EntityTypeConfiguration<Department>
{
public DepartmentMapping()
{
ToTable("Department");
HasKey(t => t.DeptId);
Property(t => t.DeptId)
.HasColumnName("DeptId")
.HasColumnType("varchar")
.HasMaxLength(50); Property(t => t.DeptName)
.HasColumnName("DeptName"); Property(t => t.ParentId)
.HasColumnName("ParentId"); Property(t => t.CreatedStamp)
.HasColumnName("CreatedStamp"); Property(t => t.UpdatedStamp)
.HasColumnName("UpdatedStamp");
}
} public class SysLogMapping:EntityTypeConfiguration<SysLog>
{
public SysLogMapping()
{
ToTable("SysLog");
HasKey(t => t.Id); Property(t => t.Id)
.HasColumnName("Id")
.HasColumnType("varchar"); Property(t => t.CreateTime)
.HasColumnName("CreateTime");
Property(t => t.Message)
.HasColumnName("Message");
Property(t => t.Module)
.HasColumnName("Module");
Property(t=>t.Operator)
.HasColumnName("Operator");
Property(t => t.Result)
.HasColumnName("Result");
Property(t => t.Type)
.HasColumnName("Type");
}
} public class UsersMapping : EntityTypeConfiguration<User>
{
public UsersMapping()
{
this.ToTable("Users");
this.HasKey(t => t.Uid); /// <summary>
/// Uid
/// </summary>
this.Property(t => t.Uid)
.HasMaxLength(50)
.HasColumnName("Uid"); Property(t => t.Name)
.HasMaxLength(50)
.HasColumnName("Name"); Property(t => t.DeptId)
.HasMaxLength(50)
.HasColumnName("DeptId"); Property(t => t.Email)
.HasMaxLength(50)
.HasColumnName("Email"); Property(t => t.MobilePhone)
.HasMaxLength(50)
.HasColumnName("MobilePhone"); Property(t => t.Passwrod)
.HasMaxLength(50)
.HasColumnName("Passwrod"); Property(t => t.QQ)
.HasMaxLength(50)
.HasColumnName("QQ"); Property(t => t.Tel)
.HasMaxLength(50)
.HasColumnName("Tel"); Property(t => t.CreatedStamp)
.HasColumnName("CreatedStamp"); Property(t => t.UpdatedStamp)
.HasColumnName("UpdatedStamp");
}
}
数据库上下文
public class DepartmentStore : DbContext
{
public DepartmentStore(string nameOrConnectionString) : base(nameOrConnectionString) { } public DbSet<Department> Departments { get; set; }
public DbSet<SysLog> SysLog { get; set; } public void AddDepartment(Department department)
{
Departments.Add(department);
} public Department GetDepartment(String DeptId)
{
return Departments.FirstOrDefault(p => p.DeptId.Equals(DeptId));
} public Boolean RemoveDepartment(Department department)
{
return RemoveDepartment(department.DeptId);
} public Boolean RemoveDepartment(String DeptId)
{
var department = GetDepartment(DeptId);
if (department == null) return false;
Departments.Remove(department);
return true;
} public void AddLog(SysLog log)
{
SysLog.Add(log);
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new Mapping.DepartmentMapping());
modelBuilder.Configurations.Add(new Mapping.SysLogMapping());
}
}
public class UserStore:DbContext
{
public UserStore(string nameOrConnectionString) : base(nameOrConnectionString) { } public DbSet<User> Users { get; set; }
public DbSet<SysLog> SysLog { get; set; } public void AddUsers(User user)
{
Users.Add(user);
} public User GetUser(String Uid)
{
return Users.FirstOrDefault(p => p.Uid.Equals(Uid));
} public Boolean Remove(User user)
{
return Remove(user.Uid);
} public Boolean Remove(String Uid)
{
var user = GetUser(Uid);
if (user == null)
return false;
Users.Remove(user);
return true;
} public void AddLog(SysLog log)
{
SysLog.Add(log);
} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new Mapping.UsersMapping());
modelBuilder.Configurations.Add(new Mapping.SysLogMapping());
}
}
业务操作
public class DepartmentService : IDisposable
{
DepartmentStore store = null; public DepartmentService(String nameOrConnectionString)
{
store = new DepartmentStore(nameOrConnectionString);
} public Boolean AddDepartement(Department dept)
{
//using (var store = new UserStore(_nameOrConnectionString))
//{
using (DbContextTransaction transaction = store.Database.BeginTransaction())
{
store.AddDepartment(dept);
store.AddLog(new SysLog
{
CreateTime = dept.CreatedStamp.Value,
Message = String.Format("添加部门【{0}】,名称【{1}】", dept.DeptId,dept.DeptName),
Module = "Department",
Result = "true",
Type = "Department"
});
Boolean result = store.SaveChanges() > 0;
store.SaveChanges();
transaction.Commit();
return result;
}
//}
}
public Boolean UpdateDepartment(Department newDept)
{
//using (var store = new UserStore(_nameOrConnectionString))
//{
var dept = store.GetDepartment(newDept.DeptId);
using (DbContextTransaction transaction = store.Database.BeginTransaction())
{
dept.DeptName = newDept.DeptName;
dept.ParentId = newDept.ParentId;
dept.UpdatedStamp = newDept.UpdatedStamp;
store.AddLog(new SysLog
{
CreateTime = newDept.UpdatedStamp.Value,
Message = String.Format("更新部门【{0}】,名称【{1}】", dept.DeptId, dept.DeptName),
Module = "Department",
Result = "true",
Type = "Department"
});
Boolean result = store.SaveChanges() > 0;
store.SaveChanges();
transaction.Commit();
return result;
}
//}
} public Boolean DeleteDepartment(String deptId)
{
using (DbContextTransaction transaction = store.Database.BeginTransaction())
{
if (store.RemoveDepartment(deptId))
{
store.AddLog(new SysLog
{
CreateTime = DateTime.Now,
Message = String.Format("删除部门【{0}】", deptId),
Module = "Department",
Result = "true",
Type = "String"
});
}
Boolean result = store.SaveChanges() > 0;
store.SaveChanges();
transaction.Commit();
return result;
}
} public void Dispose()
{
store.Dispose();
GC.ReRegisterForFinalize(this);
}
} String _nameOrConnectionString = String.Empty;
UserStore store = null;
public UserService(String nameOrConnectionString)
{
store = new UserStore(nameOrConnectionString);
_nameOrConnectionString = nameOrConnectionString;
} public Boolean AddUser(User user)
{
//using (var store = new UserStore(_nameOrConnectionString))
//{
using (DbContextTransaction transaction = store.Database.BeginTransaction())
{
store.AddUsers(user);
store.AddLog(new SysLog
{
CreateTime = user.CreatedStamp.Value,
Message = String.Format("添加用户【{0}】名称【{1}】", user.Uid, user.Name),
Module = "User",
Result = "true",
Type = "User"
});
Boolean result = store.SaveChanges() > 0;
store.SaveChanges();
transaction.Commit();
return result;
}
//}
} public Boolean UpdateUser(User newUser)
{
//using (var store = new UserStore(_nameOrConnectionString))
//{
var user = store.GetUser(newUser.Uid);
using (DbContextTransaction transaction = store.Database.BeginTransaction())
{
user.Name = newUser.Name;
user.MobilePhone = newUser.MobilePhone;
user.Passwrod = newUser.Passwrod;
user.QQ = newUser.QQ;
user.Tel = newUser.Tel;
user.UpdatedStamp = newUser.UpdatedStamp;
store.AddLog(new SysLog
{
CreateTime = newUser.UpdatedStamp.Value,
Message = String.Format("更新用户【{0}】名称【{1}】", user.Uid, user.Name),
Module = "User",
Result = "true",
Type = "User"
});
Boolean result = store.SaveChanges() > 0;
store.SaveChanges();
transaction.Commit();
return result;
}
//}
} public Boolean DeleteUser(String uid)
{
using (DbContextTransaction transaction = store.Database.BeginTransaction())
{
if (store.Remove(uid))
{
store.AddLog(new SysLog
{
CreateTime = DateTime.Now,
Message = String.Format("删除用户【{0}】", uid),
Module = "User",
Result = "true",
Type = "String"
});
}
Boolean result = store.SaveChanges() > 0;
store.SaveChanges();
transaction.Commit();
return result;
}
} public void Dispose()
{
store.Dispose();
GC.ReRegisterForFinalize(this);
}
}
测试
public class TestEntityFramework
{
const String connectionString = "data source=.;initial catalog=DataBaseName;user id=UID;password=Pwd;";
public TestEntityFramework()
{
var task1 = Task.Factory.StartNew(() =>
{
UserService userService = new UserService(connectionString);
userService.DeleteUser("TestUser1");
userService.AddUser(new EntityFramework.Model.User
{
Uid = "TestUser1",
DeptId = "Detpid1",
Email = "Email@Test.com",
MobilePhone = "13429870975",
Name = "TestUserName1",
Passwrod = "21332432",
QQ = "36592369562",
Tel = "0755-75935275",
CreatedStamp = DateTime.Now
});
userService.Dispose();
});
var task2 = Task.Factory.StartNew(() =>
{
DepartmentService service = new DepartmentService(connectionString);
service.DeleteDepartment("Detpid1");
service.AddDepartement(new EntityFramework.Model.Department
{
DeptId = "Detpid1",
DeptName = "DeptName1",
ParentId = String.Empty,
CreatedStamp = DateTime.Now
});
service.Dispose();
});
Task.WaitAll(task1, task2);
} public void Test()
{
List<Task> list = new List<Task>();
int i = 1;
do
{
var task = Task.Factory.StartNew((index) =>
{
UserService userService = new UserService(connectionString);
userService.UpdateUser(new EntityFramework.Model.User
{
Uid = "TestUser1",
DeptId = "Detpid1" + index.ToString(),
Email = "Email@Test.com" + index.ToString(),
MobilePhone = "13429870975" + index.ToString(),
Name = "TestUserName1" + index.ToString(),
Passwrod = "21332432" + index.ToString(),
QQ = "36592369562" + index.ToString(),
Tel = "0755-75935275" + index.ToString(),
UpdatedStamp = DateTime.Now
});
userService.Dispose();
}, i);
list.Add(task);
} while (i++ < 10); i = 1;
do
{
var task = Task.Factory.StartNew((index) =>
{
DepartmentService service = new DepartmentService(connectionString);
service.UpdateDepartment(new EntityFramework.Model.Department
{
DeptId = "Detpid1",
DeptName = "DeptName1" + index.ToString(),
ParentId = String.Empty,
UpdatedStamp = DateTime.Now
});
service.Dispose();
}, i);
list.Add(task);
} while (i++ < 10); Task.WaitAll(list.ToArray());
}
}
多个DbContext修改同一张表测试的更多相关文章
- 修改2张表不同SESSION相互持有记录引发的死锁
死锁产生的原因:如果有两个会话,每个会话都持有另一个会话想要的资源,此时就会发生死锁. 2张表不同SESSION持有不同记录 SQL> create table t1(id int); Tabl ...
- 利用pymysql同时修改两张表的数据
使用pymysql操作数据库中相关联的两张表需求:两张表中分别有一个字段是json格式,需要往json中再插入一个属性值’container_cloud’=’fasle’. import pymysq ...
- 关于如何修改一张表中所有行与选定字段的同sql多行语句的添加方法
利用Excel以及word文档进行操作 将表的字段以及数据全部放入Excel表中并保存. 在word表中将写好的sql语句放入文档,利用邮件--选择收件人--使用现有列表--(选择之前做好的Excel ...
- 不同数据库中同一张表的SQL循环修改语句
select sample_value,Sample_GUID,row_number() over(order by sample_value )as rownumber into #AATemp ...
- MySQL将一张表的某些列数据,复制到另外一张表,并且修改某些内容
MySQL将一张表的某些列数据,复制到另外一张表 INSERT INTO t_topic_content(content,topicId) SELECT content,id FROM t_topi ...
- Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)
1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...
- oracle创建第三方数据接口表,指定特定用户访问某张表
/*****创建用户并指定操作哪张表开始******/ --1.创建用户并设置默认表空间 CREATE USER CHENGDWY IDENTIFIED BY CHENGDWY DEFAULT TAB ...
- EF Core中如何正确地设置两张表之间的关联关系
数据库 假设现在我们在SQL Server数据库中有下面两张表: Person表,代表的是一个人: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ...
- mycat读写分离+垂直切分+水平切分+er分片+全局表 测试
原文http://blog.163.com/bigoceanwu@126/blog/static/172718064201683031639683/ 读写分离:利用最基础的mysql主从复制,事务性的 ...
随机推荐
- gdb学习(一)[第二版]
概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式) ...
- Ubuntu ROS Arduino Gazebo学习镜像iso说明(indigo版)
ROS机器人程序设计(原书第2版)学习镜像分享及使用说明 新版已经发布,请参考: http://blog.csdn.net/zhangrelay/article/details/53324759 Ub ...
- 修改Tomcat访问的端口号
修改Tomcat端口号步骤: 1.找到Tomcat目录下的conf文件夹 2.进入conf文件夹里面找到server.xml文件 3.打开server.xml文件 4.在server.xml文件里面找 ...
- Linux文件系统管理命令(第二版)
Linux文件系统管理命令 常用命令 1.df命令 查看分区使用情况 常用选项 -h 比较人性化 -m 以兆字节显示分区使用情况 显示信息: Mounted on:挂载点 Filesystem:对应的 ...
- Oracle EBS 预警系统管理(可用于配置工作流发审批邮件)
本章主要讲述配置和设置Oracle EBS预警系统管理, 它比较方便和及时发用户或系统对数据库操作情况.下面讲一操作步聚: 1.预警系统管理-->系统-->选项 名称"Unix ...
- Google主推-Android开发利器——Android Studio,这可能是最全的AS教程!
Android Studio使用手册 "工欲善其事必先利其器" 作为一个Android开发人员来说,一款好的开发工具也是相当重要的,在相当长的时间礼,Google都是基于Eclip ...
- Leetcode_235_Lowest Common Ancestor of a Binary Search Tree
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/48392713 Given a binary search ...
- LeetCode(30)-Pascal's Triangle
题目: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, ...
- iOS苹果自带UIMenuController
一.UIMenuController认识 1.默认情况下,UITextView / UITextFiled / UIWebView 都有苹果自带的有UIMenuController功能 2.UITex ...
- Group Anagrams 群组错位词
Given an array of strings, group anagrams together. For example, given: ["eat", "tea& ...