NHibernate NonUniqueObjectException或如何禁用缓存

时间:2012-04-13 09:28:19

标签: nhibernate

在开发小型ERP系统时,我遇到了这个......优雅的例外。当我尝试保存引用前一个会话中加载的现有bo的新bo时,它会出现。正如您可能已经注意到的那样,我正在使用Repository-Pattern巫婆分离的对象。

我已经做了一些研究并试图自己解决问题(没有结果)。

到目前为止我尝试了什么:

  • session.SaveOrUpdate()将导致NonUniqueObjectException
  • session.Merge()将导致TransientObjectException。
  • session.Lock(myNewObj, LockMode.None);会导致 以下异常:“无法锁定未保存的瞬态实例:
    App.Model.MyEntity“
  • CacheMode.Ignore在我的应用中创建了每个会话
  • session.Flush()然后session.Clear()
  • 关于在我的应用中创建的每个IQueryOver / ICriterion
  • 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在这种情况下似乎有点奇怪,因为它指向了错误的方向。

希望这可以帮助有类似问题的人。

0 个答案:

没有答案