【问题标题】:nhibernate: save() fails when trying to add record with many-to-one without association objectnhibernate:save() 在尝试添加具有多对一且没有关联对象的记录时失败
【发布时间】:2014-08-07 20:36:27
【问题描述】:

希望我只是遗漏了一些明显的东西。我有一个类,我想保存一个新实例,定义如下:

<class name="MyClass1" lazy="false" table="table1" dynamic-update="true">
    <id name="id" type="guid" generator="assigned" />
    <property name="class2_id" />

  <many-to-one name="class2" class="MyClass2" not-null="false" lazy="proxy">
    <column name="class2_id" not-null="true" length="40" sql-type="varchar" />
  </many-to-one>

public class MyClass1
{
    virtual public System.Guid id { get; set; }
    virtual public System.Guid class2_id { get; set; }
    virtual public MyClass2 class2 { get; set; }
}

Class2 是用互惠 Set 定义建立的。

我有 class2 的 id,但并不想为了设置引用而从数据库中提取它。

以下作品:

var class2 = session.Get<MyClass2>(class2_id);
var i = new MyClass1 { class2 = class2 };
session.Save(i);

以下失败,“非空属性引用空值或瞬态值”

var i = new MyClass1 { class2_id = class2_id };
session.Save(i);

有正确的方法吗?

【问题讨论】:

    标签: c# nhibernate many-to-one


    【解决方案1】:

    您应该做的是使用session.Load&lt;MyClass1&gt;(1) - 除非您访问 ID 以外的任何内容,否则它不会访问数据库。

    如需了解更多信息,请查看Ayende's Blog 的主题

    另外,我认为你不应该在子类中映射父 ID,你应该只映射父对象

    例如

    public class Child 
    { 
        public Parent Parent { get; set; }
    }
    

    而不是

    public class Child 
    {
        public Parent Parent { get; set; }
        public int ParentId { get; set; } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多