如何在Fluenthibernate中从具有2列CompositeId的类引用具有2列CompositId的类
本文关键字:2列 引用 CompositId 的类 CompositeId Fluenthibernate | 更新日期: 2023-09-27 18:24:28
我正在尝试创建一个
public class BaseMap<T> : ClassMap<T>
我的申请。它应该支持本地化实体,这些实体的主键必须是Id&语言:
CompositeId()
.KeyProperty(x => x.Id)
.KeyProperty(x => ((ILocalizedEntity)x).Language);
我想要的另一件事是一个本地化类能够引用另一个本地化的类。
我做了以下工作(经过大量研究,这就是我的全部):
public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity
{
if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther)))
{
return base.References(memberExpression)
.Columns("CategoryId")
.Columns("Language");
}
return base.References(memberExpression);
}
这让我在尝试插入时出现IndexOutOfRange异常,原因是"Language"属性被映射了两次,但DB中只有1个语言列,所以我这样做了:
public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity
{
if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther)))
{
return base.References(memberExpression)
.Columns("CategoryId")
.Columns("Language")
.Not.Update()
.Not.Insert();
}
return base.References(memberExpression);
}
它解决了IndexOutOfRange问题,但没有实现我想要的。因为它总是在列"CategoryId"中插入NULL,因为我指定了Not.Insert()和Not.Update(),所以它没有!
现在,我希望它映射"CategoryId",但不映射"Language",因为它已经映射了,因为它是ComposideId(主键)的一部分。
所以我尝试了一下:
public new ManyToOnePart<TOther> References<TOther>(Expression<Func<T, TOther>> memberExpression) where TOther : BaseEntity
{
if (typeof(ILocalizedEntity).IsAssignableFrom(typeof(TOther)))
{
return base.References(memberExpression)
.Columns("CategoryId")
.Nullable()
.Columns("Language")
.Not.Update()
.Not.Insert();
}
return base.References(memberExpression);
}
它不会只插入或更新"Language"而不是"CategoryId",但也没有运气。
我还试着在PK中首先使用语言:
CompositeId()
.KeyProperty(x => ((ILocalizedEntity)x).Language)
.KeyProperty(x => x.Id);
并将参考号更改为:
return base.References(memberExpression)
.Columns("Language")
.Not.Update()
.Not.Insert()
.Columns("CategoryId")
.Nullable();
但"Not.Insert()"answers"Not.Update()"仍然影响着"Language"answers"Language";"类别ID"。
我尝试在调用"References"之前映射"CategoryId",如下所示:
Map(memberExpression, "Language");
return base.References(memberExpression)
.......
但它失败了。
任何人都知道,当主键和外键共有1列时,如何从具有2列CompositeId的类引用具有2列的类CompositeId?
我有一个类似的问题,compositeid的一部分是引用,我在两周内既无法通过谷歌、SO解决,也无法独自尝试,因此我不喜欢他们。
在某些情况下,CompositeId
有它的位置,但在您描述的情况下,很可能没有。一个简单的字典和方便的属性来获得实际语言的值要简单得多,并且避免了复制所有其他属性,这些属性对每种语言都是相同的。