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