NHibernate Left Join without Foreign Key - 按字符串值加入
NHibernate Left Join without Foreign Key - Join by String value
我有 2 个实体(Oracle 数据库表)。
- ProductEntity(具有列 CaseSize - 字符串)
- ProductCsPcsEntity(有列 CaseSize - 字符串,没有 ID)
在这些 table 之间没有外键。如果 ProductEntity.Case_Size = ProductCsPcsEntity.CaseSize,我需要将 ProductCsPcsEntity 映射到 ProductEntity。
这意味着如果 ProductEntity 具有 ProductCsPcsEntity 中的 Casize,那么 ProductCsPcsEntity 行将保存到 ProductEntity 中的 属性,否则引用将为空。
存在 (ProductCsPcsEntity) 一对多 (ProductEntity) 关系,但 ProductCsPcsEntity 并非所有来自 ProductEntity 的 Casesizes(只有少数 - 60 个中有 20 个)。我想在 NHibernate 中使用类似 left join 的东西。
public sealed class ProductEntityXXMap : SubclassMap<ProductEntityXX>
{
public ProductEntityXXMap()
{
Map(x => x.CaseSize, "CASE_SIZE");
. . . .
References(x => x.CsPcs, "CASE_SIZE");
DynamicUpdate();
}
}
和
class ProductCsPcsEntityMap : EntityMap<ProductCsPcsEntity>
{
public ProductCsPcsEntityMap()
{
//Id(x => x.Id).GeneratedBy.Assigned();
Table("ProductCsPcsEntity");
Map(x => x.CaseSize, "CASESIZE");
Map(x => x.Pcs, "PCS");
Cache.ReadOnly();
}
}
请问有什么解决办法吗?我使用 NHibernate v4.0.30319、Oracle DB 和 .NET 4。
- 是否可以让 table 和没有 ID 的实体像数据库中的主键一样
- 我不使用XMLtable地图定义
- ProductEntityXX 中的所有行都具有任何 CaseSize VARCHAR 值(60 种值)
- ProductCsPcsEntityMap 有 20 个 CaseSize,我想将其加入 ProductEntityXX,而 ProductEntityXX 只有一行或来自 ProductCsPcsEntityMap 的空行
或
如何在映射中加入这些 table?
Join("ProductCsPcsEntity", x =>
{
//x.Fetch.Join().Optional();
x.KeyColumn("CASE_SIZE");
//x.Map(t => t.LeadFramePcs.Pcs).Column("PCS");
x.Map(t => t.LeadFramePcs).Column("CASESIZE");
});
但它加入 ProductEntityXX.id = ProductCsPcsEntity.casesize
我的有效解决方案:
Map(x => x.Pcs).Formula("(SELECT LF.PCS FROM ProductCsPcsEntity LF WHERE LF.CASE_SIZE = CASE_SIZE)");
看来这个解决方案可行,但并不好
我有 2 个实体(Oracle 数据库表)。
- ProductEntity(具有列 CaseSize - 字符串)
- ProductCsPcsEntity(有列 CaseSize - 字符串,没有 ID)
在这些 table 之间没有外键。如果 ProductEntity.Case_Size = ProductCsPcsEntity.CaseSize,我需要将 ProductCsPcsEntity 映射到 ProductEntity。
这意味着如果 ProductEntity 具有 ProductCsPcsEntity 中的 Casize,那么 ProductCsPcsEntity 行将保存到 ProductEntity 中的 属性,否则引用将为空。
存在 (ProductCsPcsEntity) 一对多 (ProductEntity) 关系,但 ProductCsPcsEntity 并非所有来自 ProductEntity 的 Casesizes(只有少数 - 60 个中有 20 个)。我想在 NHibernate 中使用类似 left join 的东西。
public sealed class ProductEntityXXMap : SubclassMap<ProductEntityXX>
{
public ProductEntityXXMap()
{
Map(x => x.CaseSize, "CASE_SIZE");
. . . .
References(x => x.CsPcs, "CASE_SIZE");
DynamicUpdate();
}
}
和
class ProductCsPcsEntityMap : EntityMap<ProductCsPcsEntity>
{
public ProductCsPcsEntityMap()
{
//Id(x => x.Id).GeneratedBy.Assigned();
Table("ProductCsPcsEntity");
Map(x => x.CaseSize, "CASESIZE");
Map(x => x.Pcs, "PCS");
Cache.ReadOnly();
}
}
请问有什么解决办法吗?我使用 NHibernate v4.0.30319、Oracle DB 和 .NET 4。
- 是否可以让 table 和没有 ID 的实体像数据库中的主键一样
- 我不使用XMLtable地图定义
- ProductEntityXX 中的所有行都具有任何 CaseSize VARCHAR 值(60 种值)
- ProductCsPcsEntityMap 有 20 个 CaseSize,我想将其加入 ProductEntityXX,而 ProductEntityXX 只有一行或来自 ProductCsPcsEntityMap 的空行
或
如何在映射中加入这些 table?
Join("ProductCsPcsEntity", x =>
{
//x.Fetch.Join().Optional();
x.KeyColumn("CASE_SIZE");
//x.Map(t => t.LeadFramePcs.Pcs).Column("PCS");
x.Map(t => t.LeadFramePcs).Column("CASESIZE");
});
但它加入 ProductEntityXX.id = ProductCsPcsEntity.casesize
我的有效解决方案:
Map(x => x.Pcs).Formula("(SELECT LF.PCS FROM ProductCsPcsEntity LF WHERE LF.CASE_SIZE = CASE_SIZE)");
看来这个解决方案可行,但并不好