在开发小型ERP系统时,我遇到了这个......优雅的例外。当我尝试保存引用前一个会话中加载的现有bo的新bo时,它会出现。正如您可能已经注意到的那样,我正在使用Repository-Pattern巫婆分离的对象。
我已经做了一些研究并试图自己解决问题(没有结果)。
到目前为止我尝试了什么:
session.SaveOrUpdate()
将导致NonUniqueObjectException session.Merge()
将导致TransientObjectException。session.Lock(myNewObj, LockMode.None);
会导致
以下异常:“无法锁定未保存的瞬态实例:CacheMode.Ignore
在我的应用中创建了每个会话session.Flush()
然后session.Clear()
CacheMode(CacheMode.Ignore);
我最后的希望是调整配置中的二级缓存...
_config = Fluently.Configure().Database(pConfig);
foreach (Assembly ass in pForAssamblys)
_config.Mappings(m =>
m.FluentMappings.AddFromAssembly(ass).Conventions.AddFromAssemblyOf<EnumConvention>());
_config.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Sperre>()).ExposeConfiguration(
c =>
{
c.SetProperty("cache.use_second_level_cache", "false");
c.SetProperty("cache.use_query_cache", "false");
});
但这一步也没有解决问题。 该模型包含约50个实体,因此(重新)加载会话中保存/更新的每个引用的bo实例不是一种选择。
为了使NHibernate(3.2.0.4000)和Fluent NHibernate(1.3.0.717)参考文献保持最新,我使用了NUGet。
任何建议或提示都表示赞赏。也许这与NHibernates内部id跟踪有关?我错过了什么吗?
更新:请参阅下面的解决方案(我很笨......):
buissness对象之间的关系是在模型中双向定义的。
public class Shop
{
public virtual Int Id { get; set; };
public virtual string Name { get; set; };
public virtual IList<Employee> AllEmployees{ get; set; }
public Shop()
{
AllEmployees = new List<Employee>();
}
}
public class ShopMap: ClassMap<Shop>
{
public ShopMap()
{
Id(x => x.Id);
Map(x => x.Name);
}
HasMany(c => c.Employee).Cascade.SaveUpdate().NotFound.Ignore();
}
public class Employee
{
public virtual Int Id { get; set; };
public virtual string FirstName { get; set; };
public virtual string SureName { get; set; };
public virtual Shop WorksAt{ get; set; }
public Employee()
{
}
}
public class EmployeeMap: ClassMap<Employee>
{
public EmployeeMap()
{
Id(x => x.Id);
Map(x => x.FirstName);
Map(x => x.SureName);
References(c => c.Shop).Cascade.SaveUpdate().NotFound.Ignore();
}
}
重新思考级联行为并在EmployeeMap中将级联设置为“none”解决了这个问题。然而,NonUniqueObjectException在这种情况下似乎有点奇怪,因为它指向了错误的方向。
希望这可以帮助有类似问题的人。