81 lines
2.4 KiB
C#
81 lines
2.4 KiB
C#
using NewLife.Log;
|
|
using NewLife.Security;
|
|
using XCode.DataAccessLayer;
|
|
using Xunit;
|
|
using XUnitTest.XCode.TestEntity;
|
|
|
|
namespace XUnitTest.XCode.EntityTests;
|
|
|
|
/// <summary>读写分离测试</summary>
|
|
public class ReadWriteTests
|
|
{
|
|
static ReadWriteTests()
|
|
{
|
|
#if DEBUG
|
|
NewLife.Setting.Current.LogLevel = LogLevel.All;
|
|
#endif
|
|
}
|
|
|
|
[Fact]
|
|
public void RWTest()
|
|
{
|
|
// 准备连接字符串。故意放到不同库上
|
|
DAL.AddConnStr("rw_test", "Data Source=data\\rw_test.db", null, "SQLite");
|
|
DAL.AddConnStr("rw_test.readonly", "Data Source=data\\rw_test_readonly.db", null, "SQLite");
|
|
|
|
// 反向工程建表
|
|
var d1 = DAL.Create("rw_test");
|
|
var d2 = DAL.Create("rw_test.readonly");
|
|
Role2.Meta.ConnName = "rw_test";
|
|
d1.SetTables(Role2.Meta.Table.DataTable);
|
|
d2.SetTables(Role2.Meta.Table.DataTable);
|
|
|
|
var n1 = Role2.Meta.Count;
|
|
|
|
var name = Rand.NextString(8);
|
|
XTrace.WriteLine("开始RWTest name={0}", name);
|
|
|
|
// 先删掉原来可能有的
|
|
var r0 = Role2.FindByName(name);
|
|
r0?.Delete();
|
|
|
|
// 主库插入数据
|
|
XTrace.WriteLine("主库插入数据");
|
|
var r = new Role2();
|
|
r.Name = name;
|
|
r.Insert();
|
|
|
|
// 如果查询落在从库,不可能查到。因为这个测试用例故意分开为不同的库
|
|
XTrace.WriteLine("从库查一下");
|
|
var r2 = Role2.Find(Role2._.Name == name);
|
|
//XTrace.WriteLine("FindByName: {0}", r2.ToJson());
|
|
Assert.Null(r2);
|
|
|
|
// 更新数据,还在主库
|
|
XTrace.WriteLine("再次更新主库");
|
|
r.IsSystem = true;
|
|
r.Update();
|
|
|
|
// 再找一次,理论上还是没有
|
|
XTrace.WriteLine("再找一次从库");
|
|
var r3 = Role2.Find(Role2._.Name == name);
|
|
//XTrace.WriteLine("Find: {0}", r3.ToJson());
|
|
Assert.Null(r3);
|
|
|
|
// 开启事务,此时应该走主库
|
|
{
|
|
XTrace.WriteLine("开启事务,此时应该走主库");
|
|
using var tran = Role2.Meta.CreateTrans();
|
|
var r4 = Role2.Find(Role2._.Name == name);
|
|
Assert.NotNull(r4);
|
|
}
|
|
|
|
XTrace.WriteLine("删除数据");
|
|
r.Delete();
|
|
|
|
XTrace.WriteLine("查从库记录数");
|
|
var n = Role2.FindCount();
|
|
XTrace.WriteLine("count={0}", n);
|
|
|
|
}
|
|
} |