NHibernate只读属性 - 流畅映射

4

我有如下实体:

public class Topic : EntityBase
{
    private readonly ICollection<Vote> _votes;

    public virtual string Title { get; protected set; }
    public virtual ICollection<Vote> Votes
    {
        get { return _votes; }
    }

    public virtual int VotedUpCount
    {
        get
        {
            return _votes.Count(v => v.VotedTo == VoteType.VoteUp);
        }
    }
}

我需要映射我的VotedUpCount属性(因为我在NH中遇到了错误)。但是我不需要将此属性作为数据库中的列。

我尝试了以下方法并出现了错误:无效的列名“VotedUpCount”。

public class TopicMap : ClassMap<Topic>
{
    public TopicMap()
    {
        Id(x => x.Id);
        Map(x => x.Title);
        Map(x => x.VotedUpCount).Access.ReadOnly();
        HasMany<Vote>(x => x.Votes)
            .Cascade.All();
    }
}

有没有办法使用流畅的接口将只读属性映射到实体中以使其正常工作?

你接受了一个在你的情况下不应该行得通的答案,原因在于你问题的措辞。请编辑问题以匹配答案或取消接受答案。 - Kenny Evitt
1个回答

8

为什么要映射它?它只是一个执行一些代码(也可以是一个方法)的.NET属性,与数据库无关,根本不需要映射它。

如果您需要将真实的数据库属性(从数据库列中获取值)映射为只读:

Map(x => x.PropertyName).Column("ColumnName").ReadOnly();
// Alternative (does exactly the same, but is more like the NHibernate mapping:
Map(x => x.PropertyName).Column("ColumnName").Not.Insert().Not.Update();

例如,我有预定义的数据,并将其加载到数据库中。我想使数据不变,我该怎么做? - Anton
@Anton 在你的问题中,你说你在数据库中没有这个属性。无论如何,我已经更新了我的答案,包含一个只读的数据库属性映射。 - cremor
2
测试两个版本:.ReadOnly(); 和 .Not.Insert().Not.Update(); 我确定它们不是“完全相同”的,实际上它们有不同的后果(可能是fluent中的一个错误)。不能将 .Not.Insert().Not.Update(); 与映射到同一列的第二个字段一起使用,因为在更新时它会在sql子句中将该列列出两次。 - Mark Rogers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接