代码之家  ›  专栏  ›  技术社区  ›  Valentin V

插入双向一对多关联后自动更新子集合ID

  •  0
  • Valentin V  · 技术社区  · 15 年前

    我有一个双向的一对多关联: 文件 评论 . 课程包括:

    public class Document {
       public virtual Guid Id {get; set;}
       public virtual string Title {get; set;} 
       public virtual string Body {get; set;}
       public virtual IList<Comment> Comments {get; set;}
    }
    
    public class Comment {
       public virtual Guid Id {get; set;}
       public virtual Document Document {get; set;}
       public virtual string Body {get; set;}
    }
    
    //Mappings
    
    public class DocumentMap : ClassMap<Document> {
        public DocumentMap(){
           Id(x => x.Id).GeneratedBy.GuidComb();
           Map(x=>x.Title);
           Map(x=>x.Body);
           HasMany(x=>x.Comments).Inverse().Cascade.All().AsBag();
        }
    }
    
    public class CommentMap : ClassMap<Comment> {
        public CommentMap(){
           Id(x => x.Id).GeneratedBy.GuidComb();
           Map(x=>Body);
           References(x=>x.Document).Column("DocumentId").Not.Nullable();
        }
    }
    
    //The problem
    
    var existingDocument = FetchDocumentFromDatabase(someDocumentGuidId);
    Console.WriteLine(existingDocument.Comments.Count()); //0
    existingDocument.Comments.Add(new Comment { Document = existingDocument, Body = "Test"});
    session.SaveOrUpdateCopy(existingDocument);//all OK
    //commiting transaction etc
    Console.WriteLine(existingDocument.Comments[0].Id); 
    // 00000000-0000-0000-0000-000000000000
    

    但我需要我的新评论Id在这里!

    注释已添加到DB,但对象Id仍然是空的Guid。

    如何在子对象ID作为父对象更新的一部分添加后自动填充它们?

    请指教。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Owen Pauling tmatuschek    10 年前

    问题是你在使用 SaveOrUpdateCopy . 这里发生的是 existingDocument 不用于持久化到数据库。

    http://nhibernate.info/doc/nh/en/index.html#manipulatingdata-updating-detached :

    最后一种情况可以通过使用 SaveOrUpdateCopy(Object o) . 此方法将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久实例,则将加载该实例。方法返回持久实例。如果给定实例未保存或不存在于数据库中,NHibernate将保存该实例并将其作为新的持久实例返回。否则,给定实例不会与会话关联。在大多数具有分离对象的应用程序中,您需要两种方法, SaveOrUpdate() SaveOrUpdateCopy() .

    这意味着 现有文档

    那我们能做什么呢。有几个选择:

    1. 保存或更新副本 应该是正确的 Document . 您可以将代码更改为:

      existingDocument = (Document)session.SaveOrUpdateCopy(existingDocument);
      
    2. SaveOrUpdate . 现在,我想有一个非常具体的原因,这对你来说可能是不可能的,因为你特别选择了 保存或更新副本 保存或更新 是你通常使用的东西;

    3. 文件 保存或更新副本 ,你可以放:

      var existingDocument = FetchDocumentFromDatabase(someDocumentGuidId);
      
    4. 如果你正在使用 保存或更新副本 因为 来自不同的地方 ISession ,也可以选择重新连接 现有文档 到目前为止 使用 Lock() . 在你“锁定”了 进入新的 ,您可以使用 而不是 这个例子,包括 Comment Guid 将被分配。

    推荐文章