0

私はStackOverflowとgoogle全般で検索を行いましたが、なぜこれが発生しているのか、そしてそれを修正する方法を見つけるのにまだ問題があります。私はNHibernateとFluentNHibernateを初めて使用するので、優しくしてください:)

いくつかの統合テストを行っているときに、セラーの名前を変更するだけで、NHibernateがすべての連絡先とログインの更新スクリプトを生成し、Contact_Sellerのすべての参照を削除して読み取ることがわかりました。

マップでInverse()のようなことをする必要があるように感じますが、ContactとLoginにはオブジェクトモデルのセラーまたはバイヤーへの参照がないため、その方法がわかりません。

これが私の設定です(オブジェクト、マップ、データベース)。さらに情報が必要な場合はお知らせください。ありがとうございます。

class Buyer{
    public int BuyerID {get;set;}
    public Login Login {get;set;}
    public IList<Contact> Contacts  {get;set;}
    ... Other Buyer properties ...

}
class Seller{
    public int SellerID {get;set;}  
    public Login Login {get;set;}
    public IList<Contact> Contacts  {get;set;}
    public string Name {get;set;}
    ... Other Seller properties ...
}
class Login{
    public int LoginID {get;set;}
    public string Username {get;set;}
    public byte[] Password {get;set;}
    public string Email {get;set;}
}
class Contact{
    public int ContactID {get;set;}
    ... Contact Info...
}

public BuyerMap()
{    
    Id(x => x.BuyerID);

    ... Other Seller properties ...

    HasManyToMany(x => x.Contacts).Table("Contact_Buyer").Cascade.All();            
    References(x => x.Login).Cascade.All();

}

public SellerMap()
{    
    Id(x => x.SellerID);

    ... Other Seller properties ...

    HasManyToMany(x => x.Contacts).Table("Contact_Seller").Cascade.All();           
    References(x => x.Login).Cascade.All();

}
public LoginMap()
    {
        Id(x => x.LoginID);

        Map(x => x.Username);
        Map(x => x.Password);
        Map(x => x.Email);

    }

public ContactMap()
{
    Id(x => x.ContactID);

        ... Other Contact properties ...        

}

TABLE Buyer(
    [BuyerID] [int] IDENTITY(1,1) NOT NULL, 
    [LoginID] [int] NULL,
    ... Other Buyer fields ...
    )


TABLE Seller(
    [SellerID] [int] IDENTITY(1,1) NOT NULL,    
    [LoginID] [int] NOT NULL,
    [Name]     [varchar] NOT NULL,
    ... Other Seller fields ...
    )

TABLE Login(
    [LoginID] [int] IDENTITY(1,1) NOT NULL,     
    ... Other Login fields ...
    )

TABLE Contact(
    [ContactID] [int] IDENTITY(1,1) NOT NULL,   
    ... Other Contact fields ...
    )

TABLE Contact_Seller(
    [ContactID] [int] NOT NULL, 
    [SellerID]  [int] NOT NULL, 
    )

TABLE Contact_Buyer(
    [ContactID] [int] NOT NULL, 
    [BuyerID]  [int] NOT NULL,  
    )
4

1 に答える 1

1

連絡先の順序には興味がないマッピングを見ると、それらは一意である必要があると思います。したがって、ContactsコレクションをICollection<Contact>とに変更します

HasManyToMany(x => x.Contacts).AsSet();

NHibernateは、リンクテーブルに一意のペアが含まれていることを認識しているため、一部のアクセスを最適化できます。

于 2012-10-22T13:58:14.700 に答える