簡體   English   中英

如何從FluentNhibernate中從具有2 cols CompositeId的類中引用具有2 cols CompositeId的類?

[英]How to reference a class with 2 cols CompositeId from a class with 2 cols CompositeId in FluentNhibernate?

我正在嘗試創建一個

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”屬性被映射了兩次,但是數據庫中只有1個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")
                .Not.Update()
                .Not.Insert();
        }

        return base.References(memberExpression);
    }

哪個解決了IndexOutOfRange問​​題,但是沒有完成我想要的。 因為它總是將NULL插入列“ CategoryId”中,因為我指定了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()”和“ Not.Update()”仍然影響“語言”和“類別ID”。

我嘗試在“參考”調用之前映射“ CategoryId”,如下所示:

            Map(memberExpression, "Language");
            return base.References(memberExpression)
            .......

但是失敗了。

任何人都有主意,當主鍵和外鍵中共有1列時,如何從具有2列CompositeId的類中引用具有2列CompositeId的類?

我也有類似的問題,一部分compositeid是一個參考,我無法用google,SO解決它,也無法獨自嘗試2個星期,因此不喜歡他們。

在某些情況下, CompositeId占據了位置,但是在您可能沒有描述的情況下。 一個簡單的字典和便捷屬性可以簡單地獲取實際語言的值,並且可以避免重復每種語言都相同的所有其他屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM