我正在使用流利的nhibernate,我会打开删除级联。但我不工作它只删除foregin键。 以下配置流畅的nhibernate:
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();
}
我的控制员:
contabilitaRepository.RemoveByIdFattura(testataContabilita.IdFattura);
我的存储库:
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”,而“CorpoContabilita”仍然存在,但只删除了外键。为什么呢?
答案 0 :(得分:1)
您可能必须这样做 ConventionBuilder.HasMany.Always(x =&gt; x.Cascade.AllDeleteOrphan()。Inverse()
中的映射
你还必须做
TestataContabilita.CorpoContabilita.Clear();
从集合中删除项目。
答案 1 :(得分:1)
我试图重现你的情况。我实现了某种存储库,你的映射就可以了。删除带有CorpoContabilita集合的testataContabilita对象。
但是我最初意外地在存储库中犯了几个错误 - 并且在外键中也得到了null。实际上,即使在删除testataContabilita之前它们也是null - 由于实现中的错误。
那么,您使用什么存储库实现?你如何使用Session和Transaction对象?你执行什么对象保存?也许你可以在完全实现的地方上传你的项目。