C# 使用fluent nhibernate进行级联删除
我有一个映射,如下所示:C# 使用fluent nhibernate进行级联删除,c#,postgresql,fluent-nhibernate,nhibernate-mapping,C#,Postgresql,Fluent Nhibernate,Nhibernate Mapping,我有一个映射,如下所示: public class InvoiceDetailMapping : ClassMap<InvoiceDetail> { public InvoiceDetailMapping() { Id(x => x.DetailId) .GeneratedBy.Guid(); Map(x => x.Account); Map(x => x.Credit);
public class InvoiceDetailMapping : ClassMap<InvoiceDetail>
{
public InvoiceDetailMapping()
{
Id(x => x.DetailId)
.GeneratedBy.Guid();
Map(x => x.Account);
Map(x => x.Credit);
Map(x => x.Debit);
Map(x => x.PayType);
Map(x => x.RowNumber);
References<InvoiceItem>(x => x.Invoice, "InvoiceItemId")
.Cascade.All();
}
}
public class InvoiceItemMapping : ClassMap<InvoiceItem>
{
public InvoiceItemMapping()
{
Id(x => x.RecordId)
.GeneratedBy.Guid();
Map(x => x.BatchId);
Map(x => x.Description);
Map(x => x.DocumentDate);
Map(x => x.DocumentId);
Map(x => x.DocumentType);
Map(x => x.FileId);
Map(x => x.FileName);
Map(x => x.InvoiceAmount);
Map(x => x.LocationCode);
Map(x => x.PayDate);
Map(x => x.PaymentTerms);
Map(x => x.PayNumber);
Map(x => x.PurchaseAmount);
Map(x => x.PurchaseInvoiceAmount);
Map(x => x.InvoiceId);
Map(x => x.Submittable);
Map(x => x.SubmittedBy);
Map(x => x.SubmittedTimeStamp);
Map(x => x.TaxForm1099Amount);
Map(x => x.TroubleClass);
Map(x => x.VendorDocNumber);
Map(x => x.VendorId);
Map(x => x.PersistedTimeStamp)
.CustomType<UtcDateTimeType>()
.Generated.Insert();
HasMany<InvoiceDetail>(x => x.InvoiceDetails)
.Inverse()
.Cascade.All()
.KeyColumn("InvoiceItemId");
}
}
请注意更新无操作时的
删除无操作时的行。我原以为Cascade.All()
指令会在DELETE Cascade上的UPDATE Cascade上创建一个。我做了哪些错误或不完全的事情?NH支持许多不同的RDBMS,并且已经有很长一段时间了,因此默认是在代码中完成。另一方面,FNH开始实施最常见的功能,而这一功能并非如此。而且仍然没有人提出问题来支持NH的这一特性。此外,很难说,因为在映射中方言是未知的,因此无法知道该功能是否受支持。映射看起来是正确的。你测试代码了吗?我认为NHibernate不支持直接在数据库上执行级联删除,而是通过发送额外的SQL命令来处理级联本身。@CarstenSchütte有什么代码需要测试?它编译,实体是使用NHibernate创建的,PersistenceSpecification测试通过,所有工作正常。。。看起来外键将被设计为支持级联删除。让NHibernate子系统显式删除依赖记录的操作成本要高得多。但对我来说,NHibernate似乎就是这样工作的。在我们使用SQLServer或MySQL的项目上也是如此,这两个数据库都支持外键约束上的DELETE,但NHibernate不使用它们,而是删除引用的行本身。所以这是设计的。好吧,那太差劲了。把它写下来作为答案,我会接受的。嗯,我错了。NHibernate可以支持它,前提是方言.supportscadedelete=true且ForeignKey映射已启用CascadeDeleteEnabled=true。我们也使用fluent,看起来这是FluentNHibernate中的一个bug。能否将映射文件写入临时目录并在此处添加映射?
CREATE TABLE "InvoiceDetail"
(
detailid uuid NOT NULL,
account character varying(255),
credit numeric(19,5),
debit numeric(19,5),
paytype integer,
rownumber integer,
invoiceitemid uuid,
CONSTRAINT "InvoiceDetail_pkey" PRIMARY KEY (detailid ),
CONSTRAINT fkd8588014e9009e93 FOREIGN KEY (invoiceitemid)
REFERENCES "InvoiceItem" (recordid) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION