我写了这样的代码
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");
}
}
这是配置
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();
这是删除代码
public void Delete<T>(T obj)
{
ISessionFactory fact = FluentConfiguration.CreateSessionFactory();
ISession session = fact.OpenSession();
session.Delete(obj);
session.Flush();
}
我的问题:当我想要删除一个孩子它的消息
“非法尝试与两个开放会议相关联”
请帮帮我
答案 0 :(得分:1)
错误告诉您问题,而不是您的实体或映射。
您有两个或更多个开放会话,并且您尝试将某个实体与多个实体关联。
为了响应更新的代码,我看到你有一个方法接受一个实体作为参数,创建一个新的会话工厂,创建一个新的会话,然后尝试删除该实体。
这里有一些问题:
Delete()
方法。这个实体来自哪里?您已经使用不同的ISession
清楚地将其加载到应用程序的其他位置。这是问题的症结所在。除非您Evict()
来自第一个ISession
(不推荐)的实体,否则尝试使用不同的ISession
操纵它将会抛出。Flush()
,这几乎不会被使用。您应该删除与加载它的ISession
相同的实体,并且您应该在事务中执行工作,如下所示:
using(var transaction = session.BeginTransaction())
{
session.Delete(obj);
transaction.Commit();
}