mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-11-08 18:34:44 +08:00
正式解决EF更新问题
This commit is contained in:
@@ -105,22 +105,10 @@ namespace OpenAuth.App
|
|||||||
#region 私有方法
|
#region 私有方法
|
||||||
|
|
||||||
//根据同一级中最大的语义ID
|
//根据同一级中最大的语义ID
|
||||||
private int GetMaxCascadeId(int parentId)
|
|
||||||
{
|
|
||||||
int currentCascadeId = 1;
|
|
||||||
var sameLevels = _repository.Find(o => o.ParentId == parentId);
|
|
||||||
foreach (var obj in sameLevels)
|
|
||||||
{
|
|
||||||
int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last());
|
|
||||||
if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return currentCascadeId;
|
private int[] GetSubOrgIds(int parentId)
|
||||||
}
|
|
||||||
|
|
||||||
private int[] GetSubOrgIds(int orgId)
|
|
||||||
{
|
{
|
||||||
var parent = _repository.FindSingle(u => u.Id == orgId);
|
var parent = _repository.FindSingle(u => u.Id == parentId);
|
||||||
var orgs = _repository.Find(u => u.CascadeId.Contains(parent.CascadeId)).Select(u => u.Id).ToArray();
|
var orgs = _repository.Find(u => u.CascadeId.Contains(parent.CascadeId)).Select(u => u.Id).ToArray();
|
||||||
return orgs;
|
return orgs;
|
||||||
}
|
}
|
||||||
@@ -129,7 +117,13 @@ namespace OpenAuth.App
|
|||||||
private void ChangeModuleCascade(Module module)
|
private void ChangeModuleCascade(Module module)
|
||||||
{
|
{
|
||||||
string cascadeId;
|
string cascadeId;
|
||||||
int currentCascadeId = GetMaxCascadeId(module.ParentId);
|
int currentCascadeId = 1; //当前结点的级联节点最后一位
|
||||||
|
var sameLevels = _repository.Find(o => o.ParentId == module.ParentId && o.Id != module.Id);
|
||||||
|
foreach (var obj in sameLevels)
|
||||||
|
{
|
||||||
|
int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last());
|
||||||
|
if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (module.ParentId != 0)
|
if (module.ParentId != 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -55,10 +55,46 @@ namespace OpenAuth.App
|
|||||||
/// <param name="org">The org.</param>
|
/// <param name="org">The org.</param>
|
||||||
/// <returns>System.Int32.</returns>
|
/// <returns>System.Int32.</returns>
|
||||||
/// <exception cref="System.Exception">未能找到该组织的父节点信息</exception>
|
/// <exception cref="System.Exception">未能找到该组织的父节点信息</exception>
|
||||||
public int AddOrg(Org org)
|
public int AddOrUpdate(Org org)
|
||||||
|
{
|
||||||
|
|
||||||
|
ChangeModuleCascade(org);
|
||||||
|
if (org.Id == 0)
|
||||||
|
{
|
||||||
|
_repository.Add(org);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_repository.Update(org);
|
||||||
|
}
|
||||||
|
|
||||||
|
return org.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除指定ID的部门及其所有子部门
|
||||||
|
/// </summary>
|
||||||
|
public void DelOrg(int id)
|
||||||
|
{
|
||||||
|
var delOrg = _repository.FindSingle(u => u.Id == id);
|
||||||
|
if (delOrg == null) return;
|
||||||
|
|
||||||
|
_repository.Delete(u => u.CascadeId.Contains(delOrg.CascadeId));
|
||||||
|
}
|
||||||
|
|
||||||
|
#region 私有方法
|
||||||
|
|
||||||
|
//修改对象的级联ID,生成类似XXX.XXX.X.XX
|
||||||
|
private void ChangeModuleCascade(Org org)
|
||||||
{
|
{
|
||||||
string cascadeId;
|
string cascadeId;
|
||||||
int currentCascadeId = GetMaxCascadeId(org.ParentId);
|
int currentCascadeId = 1; //当前结点的级联节点最后一位
|
||||||
|
var sameLevels = _repository.Find(o => o.ParentId == org.ParentId && o.Id != org.Id);
|
||||||
|
foreach (var obj in sameLevels)
|
||||||
|
{
|
||||||
|
int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last());
|
||||||
|
if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (org.ParentId != 0)
|
if (org.ParentId != 0)
|
||||||
{
|
{
|
||||||
@@ -76,47 +112,10 @@ namespace OpenAuth.App
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
cascadeId = "0." + currentCascadeId;
|
cascadeId = "0." + currentCascadeId;
|
||||||
org.ParentName = "";
|
org.ParentName = "根节点";
|
||||||
}
|
}
|
||||||
|
|
||||||
org.CascadeId = cascadeId;
|
org.CascadeId = cascadeId;
|
||||||
org.CreateTime = DateTime.Now;
|
|
||||||
_repository.Add(org);
|
|
||||||
_repository.Save();
|
|
||||||
return org.Id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ModifyOrg(Org org)
|
|
||||||
{
|
|
||||||
_repository.Update(org);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 删除指定ID的部门及其所有子部门
|
|
||||||
/// </summary>
|
|
||||||
public void DelOrg(int id)
|
|
||||||
{
|
|
||||||
var delOrg = _repository.FindSingle(u => u.Id == id);
|
|
||||||
if (delOrg == null) return;
|
|
||||||
|
|
||||||
_repository.Delete(u => u.CascadeId.Contains(delOrg.CascadeId));
|
|
||||||
}
|
|
||||||
|
|
||||||
#region 私有方法
|
|
||||||
|
|
||||||
//根据同一级中最大的语义ID
|
|
||||||
private int GetMaxCascadeId(int parentId)
|
|
||||||
{
|
|
||||||
int currentCascadeId = 1;
|
|
||||||
|
|
||||||
var sameLevels = _repository.Find(o => o.ParentId == parentId);
|
|
||||||
foreach (var obj in sameLevels)
|
|
||||||
{
|
|
||||||
int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last());
|
|
||||||
if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return currentCascadeId;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion 私有方法
|
#endregion 私有方法
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ namespace OpenAuth.Mvc.Controllers
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_orgApp.AddOrg(org);
|
_orgApp.AddOrUpdate(org);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -64,7 +64,7 @@ namespace OpenAuth.Mvc.Controllers
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var org = JsonHelper.Instance.Deserialize<Org>(json);
|
var org = JsonHelper.Instance.Deserialize<Org>(json);
|
||||||
_orgApp.ModifyOrg(org);
|
_orgApp.AddOrUpdate(org);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -67,6 +67,7 @@
|
|||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="TestFunction.cs" />
|
<Compile Include="TestFunction.cs" />
|
||||||
<Compile Include="TestModuleApp.cs" />
|
<Compile Include="TestModuleApp.cs" />
|
||||||
|
<Compile Include="TestRepository.cs" />
|
||||||
<Compile Include="TestRoleApp.cs" />
|
<Compile Include="TestRoleApp.cs" />
|
||||||
<Compile Include="TestUserApp.cs" />
|
<Compile Include="TestUserApp.cs" />
|
||||||
<Compile Include="TestOrgApp.cs" />
|
<Compile Include="TestOrgApp.cs" />
|
||||||
|
|||||||
@@ -19,43 +19,7 @@ namespace OpenAuth.UnitTest
|
|||||||
private TestContext testContextInstance;
|
private TestContext testContextInstance;
|
||||||
private ModuleManagerApp _app = new ModuleManagerApp(new ModuleRepository());
|
private ModuleManagerApp _app = new ModuleManagerApp(new ModuleRepository());
|
||||||
private string _time = DateTime.Now.ToString("HH_mm_ss_ms");
|
private string _time = DateTime.Now.ToString("HH_mm_ss_ms");
|
||||||
/// <summary>
|
|
||||||
///获取或设置测试上下文,该上下文提供
|
|
||||||
///有关当前测试运行及其功能的信息。
|
|
||||||
///</summary>
|
|
||||||
public TestContext TestContext
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return testContextInstance;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
testContextInstance = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#region 附加测试特性
|
|
||||||
//
|
|
||||||
// 编写测试时,可以使用以下附加特性:
|
|
||||||
//
|
|
||||||
// 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
|
|
||||||
// [ClassInitialize()]
|
|
||||||
// public static void MyClassInitialize(TestContext testContext) { }
|
|
||||||
//
|
|
||||||
// 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
|
|
||||||
// [ClassCleanup()]
|
|
||||||
// public static void MyClassCleanup() { }
|
|
||||||
//
|
|
||||||
// 在运行每个测试之前,使用 TestInitialize 来运行代码
|
|
||||||
// [TestInitialize()]
|
|
||||||
// public void MyTestInitialize() { }
|
|
||||||
//
|
|
||||||
// 在每个测试运行完之后,使用 TestCleanup 来运行代码
|
|
||||||
// [TestCleanup()]
|
|
||||||
// public void MyTestCleanup() { }
|
|
||||||
//
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
//初始化导航
|
//初始化导航
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
@@ -120,8 +84,15 @@ namespace OpenAuth.UnitTest
|
|||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void TestEdit()
|
public void TestEdit()
|
||||||
{
|
{
|
||||||
var module = _app.Find(7);
|
//var module = _app.Find(7);
|
||||||
_app.AddOrUpdate(module);
|
//_app.AddOrUpdate(module);
|
||||||
|
|
||||||
|
var module1 = new Module
|
||||||
|
{
|
||||||
|
Id = 14,
|
||||||
|
Name = DateTime.Now.ToString()
|
||||||
|
};
|
||||||
|
_app.AddOrUpdate(module1);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
using OpenAuth.App;
|
using OpenAuth.App;
|
||||||
using OpenAuth.Domain;
|
using OpenAuth.Domain;
|
||||||
@@ -14,74 +15,32 @@ namespace OpenAuth.UnitTest
|
|||||||
[TestClass]
|
[TestClass]
|
||||||
public class TestOrgApp
|
public class TestOrgApp
|
||||||
{
|
{
|
||||||
public TestOrgApp()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
//TODO: 在此处添加构造函数逻辑
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
private TestContext testContextInstance;
|
private TestContext testContextInstance;
|
||||||
private OrgManagerApp _app = new OrgManagerApp(new OrgRepository());
|
private OrgManagerApp _app = new OrgManagerApp(new OrgRepository());
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///获取或设置测试上下文,该上下文提供
|
|
||||||
///有关当前测试运行及其功能的信息。
|
|
||||||
///</summary>
|
|
||||||
public TestContext TestContext
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return testContextInstance;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
testContextInstance = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#region 附加测试特性
|
|
||||||
//
|
|
||||||
// 编写测试时,可以使用以下附加特性:
|
|
||||||
//
|
|
||||||
// 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
|
|
||||||
// [ClassInitialize()]
|
|
||||||
// public static void MyClassInitialize(TestContext testContext) { }
|
|
||||||
//
|
|
||||||
// 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
|
|
||||||
// [ClassCleanup()]
|
|
||||||
// public static void MyClassCleanup() { }
|
|
||||||
//
|
|
||||||
// 在运行每个测试之前,使用 TestInitialize 来运行代码
|
|
||||||
// [TestInitialize()]
|
|
||||||
// public void MyTestInitialize() { }
|
|
||||||
//
|
|
||||||
// 在每个测试运行完之后,使用 TestCleanup 来运行代码
|
|
||||||
// [TestCleanup()]
|
|
||||||
// public void MyTestCleanup() { }
|
|
||||||
//
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void TestAddOrg()
|
public void TestAddOrg()
|
||||||
{
|
{
|
||||||
int rootId = _app.AddOrg(new Org
|
int rootId = _app.AddOrUpdate(new Org
|
||||||
{
|
{
|
||||||
Name = "集团总部",
|
Name = "集团总部",
|
||||||
ParentId = 0
|
ParentId = 0
|
||||||
});
|
});
|
||||||
Assert.IsTrue(rootId != 0);
|
Assert.IsTrue(rootId != 0);
|
||||||
int id = _app.AddOrg(new Org
|
int id = _app.AddOrUpdate(new Org
|
||||||
{
|
{
|
||||||
Name = "一分公司",
|
Name = "一分公司",
|
||||||
ParentId = rootId
|
ParentId = rootId
|
||||||
});
|
});
|
||||||
id = _app.AddOrg(new Org
|
id = _app.AddOrUpdate(new Org
|
||||||
{
|
{
|
||||||
Name = "二分公司",
|
Name = "二分公司",
|
||||||
ParentId = rootId
|
ParentId = rootId
|
||||||
});
|
});
|
||||||
id = _app.AddOrg(new Org
|
id = _app.AddOrUpdate(new Org
|
||||||
{
|
{
|
||||||
Name = "三分公司",
|
Name = "三分公司",
|
||||||
ParentId = rootId
|
ParentId = rootId
|
||||||
@@ -93,19 +52,19 @@ namespace OpenAuth.UnitTest
|
|||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void TestDelOrg()
|
public void TestDelOrg()
|
||||||
{
|
{
|
||||||
int rootId = _app.AddOrg(new Org
|
int rootId = _app.AddOrUpdate(new Org
|
||||||
{
|
{
|
||||||
Name = "即将被删除",
|
Name = "即将被删除",
|
||||||
ParentId = 0
|
ParentId = 0
|
||||||
});
|
});
|
||||||
Assert.IsTrue(rootId != 0);
|
Assert.IsTrue(rootId != 0);
|
||||||
|
|
||||||
int id = _app.AddOrg(new Org
|
int id = _app.AddOrUpdate(new Org
|
||||||
{
|
{
|
||||||
Name = "即将被删除1",
|
Name = "即将被删除1",
|
||||||
ParentId = rootId
|
ParentId = rootId
|
||||||
});
|
});
|
||||||
id = _app.AddOrg(new Org
|
id = _app.AddOrUpdate(new Org
|
||||||
{
|
{
|
||||||
Name = "即将被删除2",
|
Name = "即将被删除2",
|
||||||
ParentId = id
|
ParentId = id
|
||||||
@@ -129,13 +88,16 @@ namespace OpenAuth.UnitTest
|
|||||||
[TestMethod]
|
[TestMethod]
|
||||||
public void TestEdit()
|
public void TestEdit()
|
||||||
{
|
{
|
||||||
var org = new Org
|
//var org = _app.GetAll().FirstOrDefault();
|
||||||
{
|
//org.Name = DateTime.Now.ToShortTimeString();
|
||||||
Id = 60,
|
//_app.AddOrUpdate(org);
|
||||||
Name = "test"
|
|
||||||
|
|
||||||
|
var org1 = new Org
|
||||||
|
{
|
||||||
|
Id = 1,
|
||||||
|
Name = DateTime.Now.ToShortTimeString()
|
||||||
};
|
};
|
||||||
_app.ModifyOrg(org);
|
_app.AddOrUpdate(org1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
63
OpenAuth.UnitTest/TestRepository.cs
Normal file
63
OpenAuth.UnitTest/TestRepository.cs
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||||
|
using OpenAuth.Domain;
|
||||||
|
using OpenAuth.Repository;
|
||||||
|
|
||||||
|
namespace OpenAuth.UnitTest
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// TestRepository 的摘要说明
|
||||||
|
/// </summary>
|
||||||
|
[TestClass]
|
||||||
|
public class TestRepository
|
||||||
|
{
|
||||||
|
|
||||||
|
#region 附加测试特性
|
||||||
|
//
|
||||||
|
// 编写测试时,可以使用以下附加特性:
|
||||||
|
//
|
||||||
|
// 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
|
||||||
|
// [ClassInitialize()]
|
||||||
|
// public static void MyClassInitialize(TestContext testContext) { }
|
||||||
|
//
|
||||||
|
// 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
|
||||||
|
// [ClassCleanup()]
|
||||||
|
// public static void MyClassCleanup() { }
|
||||||
|
//
|
||||||
|
// 在运行每个测试之前,使用 TestInitialize 来运行代码
|
||||||
|
// [TestInitialize()]
|
||||||
|
// public void MyTestInitialize() { }
|
||||||
|
//
|
||||||
|
// 在每个测试运行完之后,使用 TestCleanup 来运行代码
|
||||||
|
// [TestCleanup()]
|
||||||
|
// public void MyTestCleanup() { }
|
||||||
|
//
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
//测试被EF跟踪的对象修改
|
||||||
|
[TestMethod]
|
||||||
|
public void TestTrackingEdit()
|
||||||
|
{
|
||||||
|
|
||||||
|
var moduleRep = new ModuleRepository();
|
||||||
|
//var module = moduleRep.FindSingle(u => u.Id == 14);
|
||||||
|
//module.CascadeId = DateTime.Now.ToShortTimeString();
|
||||||
|
//如果不加u.Id !=7 则会造成异常,可理解为数据库的默认隔离级别为“读已提交”,不允许脏读!
|
||||||
|
//var obstruct = moduleRep.Find(u =>u.Id != 7);
|
||||||
|
//foreach (var module1 in obstruct)
|
||||||
|
//{
|
||||||
|
// module.CascadeId += module1.CascadeId;
|
||||||
|
//}
|
||||||
|
//moduleRep.Update(module);
|
||||||
|
|
||||||
|
var module2 = new Module
|
||||||
|
{
|
||||||
|
Id = 14,
|
||||||
|
CascadeId = DateTime.Now.ToShortTimeString()
|
||||||
|
};
|
||||||
|
moduleRep.Update(module2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user