gpt4 book ai didi

c# - Fluent NHibernate - 如何使用鉴别器创建每个子类的表映射?

转载 作者:行者123 更新时间:2023-11-30 22:30:01 25 4
gpt4 key购买 nike

我在 SO 和 google 上查看了很多关于 nhibernate/fluent-nhibernate 中的子类映射的问题,但没有找到与我有同样问题的人。我遵循了 fluent-nhibernate wiki (http://wiki.fluentnhibernate.org/Fluent_mapping#Subclasses) 的基本说明,但这没有帮助。

我有一个名为 Operation 的基本实体 - 它有一个与之关联的基表,然后我有子表 UnpaidCheque、Refund 等 - 每个子表的主键是一个外键,即 OperationId ( PK) 来自操作表。

当我创建持久性规范并尝试验证我的映射时,它试图将所有列保存到 Operation 表,而不是保存到 Operation 表,然后将 Unpaid Check 的特定列保存到 UnpaidCheque 表。

错误是:

could not insert: [UnpaidCheque][SQL: INSERT INTO Account.Operation (PaymentId, Amount, UnpaidOn, UnpaidByUserId, OperationType) VALUES (?, ?, ?, ?, 'U'); select SCOPE_IDENTITY()]
----> System.Data.SqlClient.SqlException : Invalid column name 'UnpaidOn'.
Invalid column name 'UnpaidByUserId'.

如您所见,它试图将值保存在 UnpaidByUserId 和 UnpaidOn 列中,这些列是子表/类的成员,而不是基类。

从好的方面来说,它试图将“U”插入 operationtype 列这一事实向我表明它似乎正在为类类型设置正确的描述符值。我唯一指定操作类型的地方是类映射中的 DiscriminatorValue() 调用,我没有在其他任何地方明确设置它。

类层次结构如下:

public class Operation
{
public virtual long OperationId { get; set; }
public virtual string OperationType { get; set; }
public virtual long? PaymentId { get; set; }
public virtual decimal Amount { get; set; }
}

public class UnpaidCheque : Operation
{
public virtual DateTime UnpaidOn { get; set; }
public virtual long UnpaidByUserId { get; set; }
}

类映射是:

public class OperationMap : ClassMap<Operation>
{
public OperationMap()
{
Schema("Account");
Table("Operation");
LazyLoad();
Id(_ => _.OperationId).Column("OperationId").GeneratedBy.Identity();
Map(_ => _.PaymentId).Column("PaymentId").Nullable();
Map(_ => _.Amount).Column("Amount").Not.Nullable();

DiscriminateSubClassesOnColumn("OperationType");
}
}
public class UnpaidChequeMap : SubclassMap<UnpaidCheque>
{
public UnpaidChequeMap()
{
Schema("Account");
Table("UnpaidCheque");
LazyLoad();
DiscriminatorValue("U");
KeyColumn("OperationId");
Map(_ => _.UnpaidOn).Column("UnpaidOn").Not.Nullable();
Map(_ => _.UnpaidByUserId).Column("UnpaidByUserId").Not.Nullable();
}
}

除了在子类映射中添加 KeyColumn() 之外,我看不到我所做的与示例不同的任何事情,但是如果没有它,我也会收到相同的错误消息。任何人都可以阐明我错过了什么,或者 nhibernate 是否支持我想要实现的目标?据我所知应该是。

提前致谢!

最佳答案

要使用带有鉴别器的每个子类表,需要执行以下操作:

public class UnpaidChequeMap : SubclassMap<UnpaidCheque>
{
public UnpaidChequeMap()
{
Schema("Account");
DiscriminatorValue("U");
Join("UnpaidCheque", j =>
{
j.KeyColumn("OperationId");
j.Map(_ => _.UnpaidOn).Column("UnpaidOn").Not.Nullable();
j.Map(_ => _.UnpaidByUserId).Column("UnpaidByUserId").Not.Nullable();
}
}
}

关于c# - Fluent NHibernate - 如何使用鉴别器创建每个子类的表映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9888244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com