fluent-nhibernate删除级联
如果我使用的是fluent nhibernate,我会打开delete cascade。但我不工作。它只删除foregin键。 以下配置为fluent nhibernate:fluent-nhibernate删除级联,nhibernate,asp.net-mvc-4,fluent-nhibernate,Nhibernate,Asp.net Mvc 4,Fluent Nhibernate,如果我使用的是fluent nhibernate,我会打开delete cascade。但我不工作。它只删除foregin键。 以下配置为fluent nhibernate: public virtual void TreatConfiguration(NHibernate.Cfg.Configuration configuration) { var update = new SchemaUpdate(configuration); upd
public virtual void TreatConfiguration(NHibernate.Cfg.Configuration configuration)
{
var update = new SchemaUpdate(configuration);
update.Execute(false, true);
}
public ISessionFactory CreateSessionFactory(string istanza, string db)
{
//string server = @"BRUX-PC\SQLEXPRESS";
//int port = 1433;
string server = istanza;
string database = db;
const string user = "xxxx";
const string password = "xxxx";
var connectionString = string.Format("Server={0};Database={1};User Id={2};Password={3};",
server, database, user, password);
var autoMap = AutoMap.AssemblyOf<AggregateBase>()
.Where(t => typeof (AggregateBase).IsAssignableFrom(t))
.Conventions.Add(
ConventionBuilder.HasMany.Always(x => x.Cascade.AllDeleteOrphan()),
PrimaryKey.Name.Is(o => "Id"),
ForeignKey.EndsWith("Id"),
DefaultLazy.Never(),
DefaultCascade.All(),
DynamicUpdate.AlwaysTrue(),
DynamicInsert.AlwaysTrue()
);
return Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2008.ConnectionString(connectionString))
.Mappings(m => m.AutoMappings.Add(autoMap))
.ExposeConfiguration(TreatConfiguration)
.BuildSessionFactory();
}
我的存储库:
public void RemoveByIdFattura(Guid? id)
{
var userToDelete =
repository.Single(c => c.IdFattura == id);
repository
.Remove(userToDelete);
}
我的模型:
public class TestataContabilita : AggregateBase
{
public virtual Guid IdFattura
{
get;
set;
}
public virtual int NumeroRegistrazione
{
get;
set;
}
public virtual string TipoVendita
{
get;
set;
}
public virtual IList<CorpoContabilita> CorpoContabilita { get; set; }
}
public class CorpoContabilita : AggregateBase
{
public virtual int NumeroRegistrazione
{
get;
set;
}
public virtual int? ControPartita
{
get;
set;
}
public virtual string Automatico
{
get;
set;
}
}
公共类TestataContabilita:AggregateBase
{
公共虚拟Guid IdFattura
{
得到;
设置
}
公共虚拟整数注册
{
得到;
设置
}
公共虚拟字符串TipoVendita
{
得到;
设置
}
公共虚拟IList CorpoContabilita{get;set;}
}
公共类CorpoContabilita:聚合基
{
公共虚拟整数注册
{
得到;
设置
}
公共虚拟内部控制
{
得到;
设置
}
公共虚拟字符串自动生成公司
{
得到;
设置
}
}
当我运行消除时,我只删除“TestataContabilita”,而“CorpoContabilita”保留,但只删除foregin键。为什么?你可能不得不这么做
ConventionBuilder.HasMany.Always(x=>x.Cascade.AllDeleteOrphan().Inverse()
在地图上
你也必须这样做
TestataContabilita.CorpoContabilita.Clear()
从集合中删除项目。我尝试复制您的案例。我实现了某种存储库,您的映射工作正常。使用CorpoContabilita集合删除testataContabilita对象 但我一开始在存储库中不小心犯了几个错误——外键也为null。事实上,由于实现中的错误,甚至在删除testataContabilita之前它们都为null
那么,您使用什么存储库实现?您如何处理会话和事务对象?您对什么对象执行保存?可能是您可以将项目上载到某个具有完整实现的位置。thx供您回答,但我不能调用“ConventionBuilder.HasMany.Always(x=>x.Cascade.alldeleteOrvan().Inverse())”因为它不识别“Inverse”,如果我在“repository.Remove(userToDelete);”之前插入“TestataContabilita.CorpoContabilita.Clear();”,那么我应该在哪里插入“TestataContabilita.CorpoContabilita.Clear();”,当我提交时,不要删除子项=(
public class TestataContabilita : AggregateBase
{
public virtual Guid IdFattura
{
get;
set;
}
public virtual int NumeroRegistrazione
{
get;
set;
}
public virtual string TipoVendita
{
get;
set;
}
public virtual IList<CorpoContabilita> CorpoContabilita { get; set; }
}
public class CorpoContabilita : AggregateBase
{
public virtual int NumeroRegistrazione
{
get;
set;
}
public virtual int? ControPartita
{
get;
set;
}
public virtual string Automatico
{
get;
set;
}
}