【问题标题】:NHibernate mapping - how to achieve thisNHibernate 映射 - 如何实现这一点
【发布时间】:2010-01-02 19:55:45
【问题描述】:

我已经尝试了很长一段时间来弄清楚如何完成我的任务,事实上我什至不确定我前进的方向,就我的 SQL 表而言确实是一个糟糕的方向 - 但它是我能想到的最简洁的。

我的问题很容易描述。我有一个包含 cmets 的表,我的 User 表有一个外键(代表评论的作者)。为了正确支持匿名用户,我决定使这个外键可以为空——我还提供了 3 列用于指定名称、电子邮件和网站,我希望在其中存储相关信息以防用户匿名——这些字段也是可以为空。

总之

  • 如果用户已登录,外键将包含该用户的 ID,并且名称、电子邮件和网站将为空。
  • 如果用户未登录,外键将为空,名称、电子邮件和网站将包含有关用户的数据。

在我的域模型中,我希望将其映射到用户类(属性,作者,在我的评论类上)。然后这个 User 类有一个名为“IsAnonymous”的属性 - 应该相应地设置。

理想情况下,我会设置一些映射,根据外键的值映射此 Author 属性并正确分配这些属性。我已经为我的 User 类映射了一个映射到 User 表,但我不确定我将如何做到这一点。

我曾尝试查看 IUserType 界面,但我不太明白我以前会如何处理必须从 2 个不同的表中读取的问题。

使用我当前的数据库结构是否有合理的方法来执行此操作 - 或者我应该考虑切换我的布局,如果是,切换到什么?

我从用户表中的一个简单列切换为指示匿名用户,但是当名称列设置为唯一键时,这开始给我带来问题。我希望注册用户拥有唯一的名称,但不是匿名用户。

感谢您的宝贵时间。

编辑:阅读并决定也许一些 ASCII/伪 SQL 图表会派上用场

User
-----
UserId Guid PRIMARY KEY
Name nvarchar(200) UNIQUE KEY NOT NULL
Email nvarchar(200) NOT NULL
Website nvarchar(200) NOT NULL

Comment
-------
CommentId Guid PRIMARY KEY
UserId GUID - FK-USER
Name nvarchar(200)
Email nvarchar(200)
Website nvarchar(200)

【问题讨论】:

    标签: c# sql-server nhibernate nhibernate-mapping


    【解决方案1】:

    我有类似的东西

    //map this in NH
    public virtual User LoggedInCreator {get;set;}
    //Not mapped
    public virtual User CreatorInformation {
        get {
            if(LoggedInCreator != null) return LoggedInCreator;
            return new User {
                    Name = AnonymousCommenterName,
                    Email = AnonymousCommenterEmail,
                    Website= AnonymousCommenterWebsite
                };
        }
    }
    public void SetAnonymouscommenter(string name, string email, string website)
    {
        LoggedInCreator = null;
        AnonymousCommenterName = name;
        AnonymousCommenterEmail = email;
        AnonymousCommenterWebsite = website;
    }
    

    但是,如果您想以一种更简洁的方式进行操作,您可以使用 NHibernate 的一个很棒的功能,它能够映射 Fields 以及将值存储在字段中的映射属性。
    以下是更简洁的实现方式:

    protected User _commenter;
    public virtual User Commenter
    {
        get {
            if(_commenter != null) return _commenter;
            return new User {
                    Name = AnonymousCommenterName,
                    Email = AnonymousCommenterEmail,
                    Website= AnonymousCommenterWebsite
            };
        }
        set {
            bool isAnonymous = value.Id == 0;
            _commenter = isAnonymous ? null : value;
            AnonymousCommenterName = isAnonymous ? value.Name : null;
            AnonymousCommenterEmail = isAnonymous ? value.Email : null;
            AnonymousCommenterWebsite = isAnonymous ? value.Website : null;
        }
    }
    

    您可以看到它们本质上是相同的想法,只是使用 NHibernate 功能进行了一些清理。

    【讨论】:

    • 这可行!我目前正在研究一种方法,将我的评论类子类化到我的 NHibernate 特定用例中,并仅在我的 NHibernate 代码中使用它。一旦我完成测试,我会回来看看它是否可以工作:)。
    • 谢谢你,你的建议让我以一种似乎可行的方式前进。在 NH 层中实现这一点需要一些代码,但另一方面,它可以很好地与其他地方一起使用,并且它以我认为有意义的方式存储在数据库中:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2011-09-28
    • 2010-12-25
    相关资源
    最近更新 更多