mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-04-05 17:38:01 +08:00
正式解决EF更新问题
This commit is contained in:
parent
859300b331
commit
ea76ebc35d
@ -105,22 +105,10 @@ namespace OpenAuth.App
|
||||
#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;
|
||||
}
|
||||
|
||||
private int[] GetSubOrgIds(int orgId)
|
||||
private int[] GetSubOrgIds(int parentId)
|
||||
{
|
||||
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();
|
||||
return orgs;
|
||||
}
|
||||
@ -129,7 +117,13 @@ namespace OpenAuth.App
|
||||
private void ChangeModuleCascade(Module module)
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
@ -55,10 +55,46 @@ namespace OpenAuth.App
|
||||
/// <param name="org">The org.</param>
|
||||
/// <returns>System.Int32.</returns>
|
||||
/// <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;
|
||||
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)
|
||||
{
|
||||
@ -76,47 +112,10 @@ namespace OpenAuth.App
|
||||
else
|
||||
{
|
||||
cascadeId = "0." + currentCascadeId;
|
||||
org.ParentName = "";
|
||||
org.ParentName = "根节点";
|
||||
}
|
||||
|
||||
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 私有方法
|
||||
|
@ -49,7 +49,7 @@ namespace OpenAuth.Mvc.Controllers
|
||||
{
|
||||
try
|
||||
{
|
||||
_orgApp.AddOrg(org);
|
||||
_orgApp.AddOrUpdate(org);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -64,7 +64,7 @@ namespace OpenAuth.Mvc.Controllers
|
||||
try
|
||||
{
|
||||
var org = JsonHelper.Instance.Deserialize<Org>(json);
|
||||
_orgApp.ModifyOrg(org);
|
||||
_orgApp.AddOrUpdate(org);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -67,6 +67,7 @@
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="TestFunction.cs" />
|
||||
<Compile Include="TestModuleApp.cs" />
|
||||
<Compile Include="TestRepository.cs" />
|
||||
<Compile Include="TestRoleApp.cs" />
|
||||
<Compile Include="TestUserApp.cs" />
|
||||
<Compile Include="TestOrgApp.cs" />
|
||||
|
@ -19,43 +19,7 @@ namespace OpenAuth.UnitTest
|
||||
private TestContext testContextInstance;
|
||||
private ModuleManagerApp _app = new ModuleManagerApp(new ModuleRepository());
|
||||
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]
|
||||
@ -120,8 +84,15 @@ namespace OpenAuth.UnitTest
|
||||
[TestMethod]
|
||||
public void TestEdit()
|
||||
{
|
||||
var module = _app.Find(7);
|
||||
_app.AddOrUpdate(module);
|
||||
//var module = _app.Find(7);
|
||||
//_app.AddOrUpdate(module);
|
||||
|
||||
var module1 = new Module
|
||||
{
|
||||
Id = 14,
|
||||
Name = DateTime.Now.ToString()
|
||||
};
|
||||
_app.AddOrUpdate(module1);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
|
@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using OpenAuth.App;
|
||||
using OpenAuth.Domain;
|
||||
@ -14,74 +15,32 @@ namespace OpenAuth.UnitTest
|
||||
[TestClass]
|
||||
public class TestOrgApp
|
||||
{
|
||||
public TestOrgApp()
|
||||
{
|
||||
//
|
||||
//TODO: 在此处添加构造函数逻辑
|
||||
//
|
||||
}
|
||||
|
||||
private TestContext testContextInstance;
|
||||
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]
|
||||
public void TestAddOrg()
|
||||
{
|
||||
int rootId = _app.AddOrg(new Org
|
||||
int rootId = _app.AddOrUpdate(new Org
|
||||
{
|
||||
Name = "集团总部",
|
||||
ParentId = 0
|
||||
});
|
||||
Assert.IsTrue(rootId != 0);
|
||||
int id = _app.AddOrg(new Org
|
||||
int id = _app.AddOrUpdate(new Org
|
||||
{
|
||||
Name = "一分公司",
|
||||
ParentId = rootId
|
||||
});
|
||||
id = _app.AddOrg(new Org
|
||||
id = _app.AddOrUpdate(new Org
|
||||
{
|
||||
Name = "二分公司",
|
||||
ParentId = rootId
|
||||
});
|
||||
id = _app.AddOrg(new Org
|
||||
id = _app.AddOrUpdate(new Org
|
||||
{
|
||||
Name = "三分公司",
|
||||
ParentId = rootId
|
||||
@ -93,19 +52,19 @@ namespace OpenAuth.UnitTest
|
||||
[TestMethod]
|
||||
public void TestDelOrg()
|
||||
{
|
||||
int rootId = _app.AddOrg(new Org
|
||||
int rootId = _app.AddOrUpdate(new Org
|
||||
{
|
||||
Name = "即将被删除",
|
||||
ParentId = 0
|
||||
});
|
||||
Assert.IsTrue(rootId != 0);
|
||||
|
||||
int id = _app.AddOrg(new Org
|
||||
int id = _app.AddOrUpdate(new Org
|
||||
{
|
||||
Name = "即将被删除1",
|
||||
ParentId = rootId
|
||||
});
|
||||
id = _app.AddOrg(new Org
|
||||
id = _app.AddOrUpdate(new Org
|
||||
{
|
||||
Name = "即将被删除2",
|
||||
ParentId = id
|
||||
@ -129,13 +88,16 @@ namespace OpenAuth.UnitTest
|
||||
[TestMethod]
|
||||
public void TestEdit()
|
||||
{
|
||||
var org = new Org
|
||||
{
|
||||
Id = 60,
|
||||
Name = "test"
|
||||
//var org = _app.GetAll().FirstOrDefault();
|
||||
//org.Name = DateTime.Now.ToShortTimeString();
|
||||
//_app.AddOrUpdate(org);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user