正式解决EF更新问题

This commit is contained in:
yubaolee 2015-11-24 15:49:00 +08:00
parent 859300b331
commit ea76ebc35d
7 changed files with 141 additions and 151 deletions

View File

@ -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)
{

View File

@ -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

View File

@ -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)
{

View File

@ -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" />

View File

@ -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]

View File

@ -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);
}
}
}

View 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);
}
}
}