gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:53:00 25 4
gpt4 key购买 nike

我在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com