簡體   English   中英

流利的nHibernate將HasMany映射到沒有主鍵的實體/表

[英]Fluent nHibernate map HasMany to Entity/Table with no Primary Key

我在嘗試建立HasMany關系到沒有主鍵的表支持的實體時遇到了最大的麻煩。

ClassA具有CompositeId 為了規避缺乏的primary keyClassB ,我試圖創建一個CompositeIdClassB這是由表中的所有列。 無論我嘗試了什么,都沒有任何效果。

這些是我的類和映射。

public class ClassA
{
    public virtual int a_1_id {get;set;}
    public virtual string a_2_id {get;set;}

    public virtual IList<classB> ClassBs { get; set; }

    public override int GetHashCode()
    {
        int hashCode = 0;
        hashCode = hashCode ^ a_1_id ^ a_2_id.GetHashCode();
        return hashCode;
    }

    public override bool Equals(object obj)
    {
        var toCompare = obj as ClassB;

        return (toCompare != null) && (this.GetHashCode() != toCompare.GetHashCode());
    }
}

public class ClassAMap : ClassMap<ClassA>
{
    public ClassAMap()
    {
        Schema("dbo");

        Table("ClassA");

        Not.LazyLoad();

        CompositeId()           
            .KeyProperty(x => x.a_1_id, "a_1_id")
            .KeyProperty(x => x.a_2_id, "a_2_id");      

        HasMany(x => x.ClassBs)
            .Table("ClassB")
            .KeyColumn("a_2_id")
            .Not.LazyLoad();
    }
}

public class ClassB
{
    public virtual string a_2_id {get;set;}
    public virtual string b_field1 {get;set;}

    public override int GetHashCode()
    {
        int hashCode = 0;
        hashCode = hashCode         
            ^ a_2_id.GetHashCode() 
            ^ b_field1.GetHashCode();

        return hashCode;
    }

    public override bool Equals(object obj)
    {
        var toCompare = obj as ClassB;

        return (toCompare != null) && (this.GetHashCode() != toCompare.GetHashCode());
    }
}

public class ClassBMap : ClassMap<ClassB>
{
    public ClassBMap()
    {
        Schema("dbo");

        Table("ClassB");

        Not.LazyLoad();

        CompositeId()           
            .KeyProperty(x => x.a_2_id, "a_2_id")
            .KeyProperty(x => x.b_field1, "b_field1");      
    }
}

如果ClassB依賴於ClassA,則無需將classB映射為實體。

public class ClassA
{
    public virtual int Id1 {get;set;}
    public virtual string Id2 {get;set;}

    public virtual IList<string> Bs { get; private set; }

    public override int GetHashCode()
    {
        return (Id1 << 16) ^ Id2.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        var toCompare = obj as ClassA;

        return (toCompare != null) && (this.Id1 == toCompare.Id1) && (this.Id2 == toCompare.Id2);
    }
}

public class ClassAMap : ClassMap<ClassA>
{
    public ClassAMap()
    {
        Schema("dbo");

        Table("ClassA");

        Not.LazyLoad();

        CompositeId()           
            .KeyProperty(x => x.Id1, "a_1_id")
            .KeyProperty(x => x.Id2, "a_2_id");

        HasMany(x => x.ClassBs)
            .AsSet()
            .Table("ClassB")
            .KeyColumn("a_2_id")
            .Not.LazyLoad(),
            .Element("b_field1");  // if there is only 1 value column or
            .Component(c =>        // if there is more than 1 value column
            {
                c.ParentReference(x => x.A);
                c.Map(x => x.Value1, "b_field1");
                c.Map(x => x.Value2, "b_field2");
                c.Map(x => x.Value3, "b_field3");
            });
    }
}

public class ClassB
{
    public virtual ClassA A {get;set;}
    public virtual string Value1 {get;set;}
    public virtual string Value2 {get;set;}
    public virtual string Value3 {get;set;}
}

注意:ClassA的gethashcode實現是完全錯誤的,並且Euqals不應依賴哈希碼,因為它將發生沖突

暫無
暫無

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

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