c# - NHibernate 正在将我的收藏变成只读。我怎样才能阻止它?

标签 c# nhibernate collections fluent-nhibernate

我在使用 Nhibernate/Fluent NHibernate 时遇到一些问题

我有一个类,它有一个集合和一个支持字段,以及像这样操作集合的方法:

编辑:我已将 virtual 修饰符添加到 Children,因为我忘记将其粘贴到下面的示例代码中(当时是凌晨 2 点)

public class MyClass
{
    private IList<SomeChildObject> children;

    public virtual IList<SomeChildObject> Children { get { return new ReadOnlyCollection<SomeChildObject>(children); } }

    public void AddToChildren(SomeChildObject obj)
    {
        children.Add(obj);
    }
}

我有这样的 Fluent NHibernate 映射:

public class MyClassMapping : ClassMap<MyClass>
{
    public MyClassMapping()
    {
        HasMany(x => x.Children)
            .Inverse()
            .LazyLoad()
            .Cascade.AllDeleteOrphan()
            .KeyColumnNames.Add("MyClassID")
            .Access.AsReadOnlyPropertyThroughCamelCaseField();
    }
}

现在,当我从数据库中拉回 MyClass 的一个实例时,一切都很好。

MyClass myClass = repo.GetById(12);

myClass.AddToChildren(new SomeChildObject());

这很好用。

然后我进行一些更改并将更改保存到数据库。

保存更改后,我会尝试添加另一个子对象

myClass.AddToChildren(new SomeChildObject("Another One!!!"));

它以“InvalidOperationException: The Collection is ReadOnly”结束

NHibernate 似乎在它的代理中的某个地方做了一些事情。有谁知道如何解决这个问题?

提前致谢。

最佳答案

如果您在实体级别禁用延迟加载会怎样?也就是说,确保 NHibernate 不为此类使用动态代理? (这对延迟加载集合的能力没有影响;延迟加载集合仍然有效)。

在我的应用程序中,我使用与您在此处演示的方法相同的方法(私有(private)集合字段、环绕集合并返回只读列表的属性),并且我没有遇到您遇到的那些问题有。 但是,区别在于我在我的映射中声明(我不使用流利的 NHibernate,而是普通的旧 xml 文件:)),NHibernate 不应该为我的类使用动态代理:

 <class name="SomeClass" table="SomeTable" lazy="false">
      <!-- rest of mapping goes here -->
   </class>

关于c# - NHibernate 正在将我的收藏变成只读。我怎样才能阻止它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1575700/

相关文章:

c# - 调整内容大小以填充窗口的 `Client Area`

NHibernate 3.3 和 SysCache

nhibernate - 从多个程序集映射

c# - 将模型中的数据对象集合绑定(bind)到 View 中的一组控件 (WPF)

c# - umbraco认证

c# - 使用 ServiceStack.Text : override the CreateInstance stuff?

c# - .net 中的 Bootstrap dll 是什么?

c# - 无法将类型 'System.Collections.ArrayList' 的对象强制转换为类型 'System.Collections.Generic.IEnumerable'

java - 具有原子替换的线程安全可序列化集合

java - 如何正确地延迟初始化 Map of Map 的 Map?