2

我想要一个名为“Message”的映射类。这个类应该包括一个唯一的 id、标题、文本以及关于发送者和接收者的信息。我需要他们的用户 ID 和他们的名字,所以我创建了另一个名为“用户”的类。这个类包括这两个属性(稍后我将为这个类创建一些方法并在不同的类中使用它,所以我不能只使用类“消息”)。

这是我的代码

public class User
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
}

public class Message
{
    public virtual Guid Id { get; set; }
    public User sender;
    public User receiver;
    public virtual string subject { get; set; }
    public virtual string text { get; set; }
}

public class MessageMap : ClassMap<Message>, IMappedEntity
{
    public MessageMap()
    {
        Id(x => x.Id, "MessageId");
        Map(x => x.sender.Id, "SenderId");
        Map(x => x.receiver.Id, "ReceiverId");
        Map(x => x.subject);
        Map(x => x.text);
    }
}

如您所见,我只想保存发送者和接收者的用户 ID,而不是他们的姓名。因为 x.Id、x.sender.Id 和 x.receiver.Id 具有属性“Id”,所以我在数据库中为它们写了一个特定的名称。但是,如果我尝试加载该站点,则会出现此错误:已添加时尝试添加属性“Id”。,即使在我确定列的名称后它们不再是名为“Id”的属性...

你能给我一个提示我做错了什么吗?

4

2 回答 2

3

我终于找到了另一个解决方案:我将 Message-Map 的映射更改为:

public class MessageMap : ClassMap<Message>, IMappedEntity
{
    public MessageMap()
    {
        Id(x => x.Id);
        Component(
            x => x.sender,
            userId =>
            {
                userId.Map(x => x.Id, "senderId");
            }
        );
        Component(
            x => x.receiver,
            userId =>
            {
                userId.Map(x => x.Id, "receiverId");
            }
        );

        Map(x => x.subject);
        Map(x => x.text);

    }

现在,我不必映射用户类,所以我没有只有我的用户 ID 的表。

我对使用 nHibernate 不太熟悉,所以我不确定这是否是解决问题的最佳方法,但在我看来,这比 Chev 提出的解决方案更适合我的问题(但我非常感谢您回答我!)

于 2012-05-18T14:34:33.890 回答
2

如下更改 MessageMap。

public class MessageMap : ClassMap<Message>, IMappedEntity
{
    public MessageMap()
    {
        Id(x => x.Id);
        References(x => x.Sender);
        References(x => x.Receiver);
        Map(x => x.subject);
        Map(x => x.text);
    }
}
于 2012-05-15T06:04:24.437 回答