Fluent NHibernate单向关系导致许多更新

Fluent NHibernate单向关系导致许多更新,nhibernate,fluent,relationships,Nhibernate,Fluent,Relationships,我已经在StackOverflow和google上做了一些搜索,但我仍然很难找到为什么会发生这种情况以及如何解决它。我是新来的NHibernate和FluentNHibernate,所以请温柔:) 在做一些集成测试时,我发现如果我只是修改卖家的名字,NHibernate会为所有联系人和登录名生成更新脚本,并删除联系人中的所有引用并读取它们 我觉得我应该在我的地图中做一些像Inverse()的事情,但我不知道如何做,因为联系人和登录在我的对象模型中没有对卖家或买家的引用 这是我的设置(对象、地图和

我已经在StackOverflow和google上做了一些搜索,但我仍然很难找到为什么会发生这种情况以及如何解决它。我是新来的NHibernate和FluentNHibernate,所以请温柔:)

在做一些集成测试时,我发现如果我只是修改卖家的名字,NHibernate会为所有联系人和登录名生成更新脚本,并删除联系人中的所有引用并读取它们

我觉得我应该在我的地图中做一些像Inverse()的事情,但我不知道如何做,因为联系人和登录在我的对象模型中没有对卖家或买家的引用

这是我的设置(对象、地图和数据库)。如果您需要更多信息,请告诉我,谢谢

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,  
    )
class买家{
public int BuyerID{get;set;}
公共登录名{get;set;}
公共IList联系人{get;set;}
…其他买方财产。。。
}
班主任{
public int SellerID{get;set;}
公共登录名{get;set;}
公共IList联系人{get;set;}
公共字符串名称{get;set;}
…其他卖方财产。。。
}
类登录{
public int LoginID{get;set;}
公共字符串用户名{get;set;}
公共字节[]密码{get;set;}
公共字符串电子邮件{get;set;}
}
班级联系{
public int ContactID{get;set;}
…联系方式。。。
}
公共购买者映射()
{    
Id(x=>x.BuyerID);
…其他卖方财产。。。
HasManyToMany(x=>x.Contacts).Table(“Contact_Buyer”).Cascade.All();
引用(x=>x.Login).Cascade.All();
}
公共卖方MAP()
{    
Id(x=>x.SellerID);
…其他卖方财产。。。
HasManyToMany(x=>x.Contacts).Table(“Contact_Seller”).Cascade.All();
引用(x=>x.Login).Cascade.All();
}
公共登录映射()
{
Id(x=>x.LoginID);
映射(x=>x.Username);
映射(x=>x.Password);
Map(x=>x.Email);
}
公共联系人地图()
{
Id(x=>x.ContactID);
…其他联系人属性。。。
}
餐桌买家(
[BuyerID][int]标识(1,1)不为空,
[LoginID][int]NULL,
…其他买家字段。。。
)
卖桌子的(
[SellerID][int]标识(1,1)不为空,
[LoginID][int]不为空,
[Name][varchar]不为空,
…其他卖方字段。。。
)
表登录(
[LoginID][int]标识(1,1)不为空,
…其他登录字段。。。
)
表触点(
[ContactID][int]标识(1,1)不为空,
…其他联系人字段。。。
)
表联系卖方(
[ContactID][int]不为空,
[SellerID][int]不为空,
)
表联系买家(
[ContactID][int]不为空,
[BuyerID][int]不为空,
)

查看这些映射,您对联系人的顺序不感兴趣,但我认为它们应该是唯一的。因此,将Contacts集合更改为
ICollection
,然后

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

NHibernate可以优化某些访问,因为它知道链接表包含唯一的对。

优点(刚刚对资产()进行了一些研究)如果我将联系人集合更改为ICollection,我是否仍然需要资产()?或者它会看到ICollection并使用它的反射魔法?我要试试这个!感谢Hibernate将假定ICollection为Bag Iesi.Collections.Generic.ISet将自动成为AsSet(),我没有忘记!我今天测试了这个,它导致一些测试失败。特别是,如果我创建一个新的卖家,添加几个新联系人(所有联系人的ID均为0),它将只保留第一个联系人。我认为当它强制转换到集合时,它会删除除一个联系人以外的所有联系人,因为他们都具有相同的ID。这正常吗?集合表示唯一的项,如果测试失败,那么equals实现是不正确的。尝试
var other=obj作为实体;返回Id==0?ReferenceEqual(this,other):Id==other.Id您是对的,我添加了ID==0的条件,但是我不知道ReferenceEquals。再次感谢!