【问题标题】:NHibernate entity design with a private member带有私有成员的 NHibernate 实体设计
【发布时间】:2011-08-10 11:37:31
【问题描述】:

在我的数据库中,我想将“视图”之一的用户 GUI 设置保存为分号分隔的字符串,即:“1;31;5;411;”。

我在这个项目中使用了 NNibernate,这是这个特定私有成员的映射和代码;

User.Settings 的 C# 实体代码

private string _linkConsole = "0";

[DataMember]
public LinkConsole LinkConsole
{
    get { return new LinkConsole(_linkConsole); }
    set { _linkConsole = value.GetSqlString(); }
}

XML 映射:

<property name="LinkConsole" type="System.String" access="field.camelcase-underscore" not-null="true"/>

LinkConsole 有很多用于 GUI 特定设置的公共方法,这些方法用于切换某些私有成员的值。

当需要将此设置保存到数据库时,.GetSqlString();格式化字符串并将其写入私有成员 _linkConsole ,这是暴露给 NHibernate 和数据库的私有成员。

问题:

当我尝试使用 GUI 做某事时,即:

User.Settings.LinkConsole.SetRightPaneContent(50);

这从未存储在对象 LinkConsole 上,我似乎无法弄清楚为什么? 当我设置断点时,我在 Visual Studio 中收到一条消息:

您的介入请求导致物业或运营商自动介入

也许这是问题的结果,我以错误的方式设计它? 如果是这样,是否可以结合私有字符串成员来实现这一点?

任何帮助将不胜感激!谢谢! :-)

【问题讨论】:

    标签: c# nhibernate class-design


    【解决方案1】:

    您是否考虑过为 LinkConsole 实现自定义 IUserType 以用作 NHibernate 类型?

    您描述的用例正是 IUserType 的用途。

    【讨论】:

    • 感谢您的意见!我现在将研究 IUserType .. :-)
    【解决方案2】:

    这并不是真正的NHibernate 问题。 LinkConsole 是一个引用类型。如果你设置它的一个成员,它不会调用你从中获取它的属性的set 方法,它会设置从原始get 返回的实例的值。如果您希望此代码正常工作,您需要从User 获取一个新的LinkConsole 实例,调用设置设置的方法,然后将用户的LinkConsole 属性设置为您配置的实例。

    【讨论】:

    • 甜蜜!所以这是一个整体糟糕的设计/尝试设计一些无法工作的东西。谢谢 tom.dietrich!
    【解决方案3】:

    问题可能在于您如何设置正在写入数据库的私有变量。如果没有看到您的代码,我无法确定,但请查看以下文章,以便能够使用 Visual Studio 进入属性:

    http://msdn.microsoft.com/en-us/library/cc667388.aspx

    【讨论】:

    • 感谢您的意见。我可以使用断点进行调试,并且在将其写入数据库之前就出现了问题。就像私人成员永远不会更新一样,无论出于何种原因。也许在此过程中创建了两个不同的 LinkConsole 实例,这就是似乎私有成员在应用于数据库的“最终”实例上没有更改的原因?所以,这就是为什么我认为它只是我的糟糕设计?但如果这真的有效,那就太好了,因为它非常方便。任何设计改进(由任何人)将不胜感激!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2012-11-04
    • 2012-12-12
    相关资源
    最近更新 更多