“尝试在已经添加时添加属性'Id'。” - 两次实现自己的类时出错

时间:2012-05-14 18:34:22

标签: fluent-nhibernate

我想要一个名为“Message”的映射类。此类应包括唯一ID,标题,文本以及有关发件人和接收者的信息。我需要他们的User-ID作为他们的名字,所以我创建了另一个名为“User”的类。这个类包含这两个属性(稍后我会为这个类创建一些方法并在不同的类中使用它,所以我不能使用onyl类“Message”)。

这是我的代码

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”的属性列...

你能否暗示我做错了什么?

2 个答案:

答案 0 :(得分: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);

    }

现在,我不必映射User-Class,所以我没有只有我的Userid的表。

我对使用nHibernate并不太熟悉,所以我不是很清楚这是解决这个问题的最佳方法,但在我看来,这更符合我的问题,然后是Chev提出的解决方案(但是我非常感谢你回答了我!)

答案 1 :(得分: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);
    }
}