Fluent nhibernate Fluent nhibernate的问题
我已经写了这样的代码Fluent nhibernate Fluent nhibernate的问题,fluent-nhibernate,Fluent Nhibernate,我已经写了这样的代码 public class person { public person() { public virtual int Id { get; set; } public virtual string Code { get; set; } } } public class Child : P
public class person
{
public person()
{
public virtual int Id { get; set; }
public virtual string Code { get; set; }
}
}
public class Child : Person
{
public person()
{
public virtual string Name{ get; set; }
public virtual string Lastname{ get; set; }
}
}
public class Book
{
public virtual int Id { get; set; }
public virtual string Name {get;set;}
}
我的Mapper类是这样的
public class PersonMapping : ClassMap<Person>
{
public PersonMapping()
{
Table("tblPersons");
Id(x => x.Id).GeneratedBy.Native();
Map(p => p.Code);
JoinedSubClass<Child>("Id", MapChild);
}
public static void MapChild(JoinedSubClassPart<Child> child)
{
child.Table("tblChilds");
child.Map(p => p.Name);
child.Map(p => p.Lastname);
child.HasMany(x => x.Relatives);
}
}
public class RelativeMapping : ClassMap<Relative>
{
public RelativeMapping()
{
Table("tblRelatives");
Id(x => x.Id);
Map(p => p.Name);
References(x => x.Child).Column("ChildId");
}
}
公共类PersonMapping:ClassMap
{
公众人物地图
{
表(“tblPersons”);
Id(x=>x.Id).GeneratedBy.Native();
Map(p=>p.Code);
JoinedSubClass(“Id”,MapChild);
}
公共静态void映射子类(JoinedSubclass部分子类)
{
儿童表(“tblChilds”);
Map(p=>p.Name);
Map(p=>p.Lastname);
child.HasMany(x=>x.亲戚);
}
}
公共类相对映射:类映射
{
公共相对映射()
{
表(“TBL相关”);
Id(x=>x.Id);
Map(p=>p.Name);
引用(x=>x.Child).Column(“ChildId”);
}
}
这是配置
Assembly assm = Assembly.Load("BLL");
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c => c
.FromAppSetting("ConnStr"))
.Cache(c => c
.UseQueryCache()
.ProviderClass<HashtableCacheProvider>())
.ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssembly(assm))
.BuildSessionFactory();
Assembly=Assembly.Load(“BLL”);
流畅地返回。Configure()
.数据库(MsSqlConfiguration.MsSql2008
.ConnectionString(c=>c
.FromAppSetting(“ConnStr”))
.Cache(c=>c
.UseQueryCache()
.ProviderClass())
.ShowSql())
.Mappings(m=>m.FluentMappings.AddFromAssembly(assm))
.BuildSessionFactory();
这是删除的代码
public void Delete<T>(T obj)
{
ISessionFactory fact = FluentConfiguration.CreateSessionFactory();
ISession session = fact.OpenSession();
session.Delete(obj);
session.Flush();
}
public void Delete(T obj)
{
ISessionFactory事实=FluentConfiguration.CreateSessionFactory();
ISession session=fact.OpenSession();
删除(obj);
session.Flush();
}
我的问题:当我想删除一个孩子的信息时“非法尝试与两个打开的会话关联”
请帮助我错误告诉您问题所在,而不是您的实体或映射 您有两个或多个打开的会话,并且您正试图将某个实体与其中的多个会话关联 更新 作为对更新代码的响应,我看到您有一个方法,该方法接受一个实体作为参数,创建一个新的会话工厂,创建一个新会话,然后尝试删除该实体 这里有一些问题:
Delete()
方法。这个实体来自哪里?显然,您已经在应用程序的其他地方加载了它,使用了不同的ISession
。这是问题的症结所在。除非您从第一个ISession
(不推荐)中退出()实体,否则尝试使用不同的ISession
操作它将抛出Flush()
,几乎不应该使用它ISession
,并且您应该在事务中执行工作,如下所示:
using(var transaction = session.BeginTransaction())
{
session.Delete(obj);
transaction.Commit();
}
您好,谢谢使用答案,但当我想添加一个新的子项时,它没有这个问题,只是在删除一个子项时它有这个问题,我该怎么办?@ushuah潜在的回答者需要查看相关代码以帮助您--您创建会话的代码并删除子实体。谢谢这真的帮了我的忙