2010-07-28 111 views
1

我的类客户:NHibernate的错误(无法插入具有唯一索引重复键)

public class Client : Entity 
{ 
    public Client() 
    { 
     ListClientObjectX = new List<ClientObjectX>();   
    } 

    public virtual IList<ClientObjectX> ListClientObjectX { get; set; } 
    ... 
} 

我的班级ClientObjectX

public class ClientObjectX: Entity 
{ 
    public ClientObjectX() 
    { 
     Client = new Client(); 
     ObjectX = new ObjectX(); 
    } 

    public virtual Client Client { get; set; } 
    public virtual ObjectX ObjectX { get; set; } 
    public virtual string Name {get; set;} 
    ... 
} 

我ClientObjectX表有2列的唯一索引(客户端ID和ObjectXID):idxClientObjectX

客户端映射(流利):

public class ClientMap : ClassMap<Client> 
{ 
    public ClientMap() 
    { 
     Table("tblClient"); 

     Id(x => x.ID,"ClientID").GeneratedBy.Identity().UnsavedValue(0); 

     HasMany<ClientObjectX>(x => x.ListClientObjectX) 
     .Inverse() 
     .Cascade.AllDeleteOrphan() 
     .KeyColumns.Add("ClientID");   
    } 
} 

所以,每例如,当我打开一个客户端,即在ListClientObjectX一个对象:

var client = new Repository<Client>().Load(2); 

而且从ListClientObjectX删除的对象:

client.ListClientObjectX.RemoveAt(0); 

没有保存/提交呢。现在我一个对象添加到ListClientObjectX与同一个客户端和ObjectXID:

client.ListClientObjectX.Add(test); 

当我保存,我得到了一个错误:

repCliente.SaveOrUpdate(client); 

不能在对象插入重复键行“DBO。 tblClientObjectX'具有唯一索引'idxClientObjectX'。 该声明已被终止。

为什么会出现该错误?我该如何解决这个问题?

感谢

回答

1

您需要在另外的ClientObjectX.Client参考空集,从集合中删除。从集合中删除它不会使其成为孤立的,因此在会话刷新时不会被删除。

var objectX = client.ListClientObjectX[0]; 
client.ListClientObjectX.Remove(objectX); 
objectX.Client = null; 

将操作分成两个交易可能是一个更好的主意;一个删除,另一个添加具有相同唯一组合的对象。如果您经常在一次操作中添加和删除具有相同唯一组合的对象,我认为您会遇到麻烦。

+0

谢谢杰米,但它没有工作...同样的错误... – Paul 2010-07-28 16:41:01

0

您可能需要考虑为此集合映射<set>。一定要覆盖您的ListClientObjectX对象上的Equals()和GetHashCode()。这将确保集合中子对象的唯一性,并将完全避免添加重复的问题。

相关问题