NHIbernate readonly属性 - 流畅的映射

Aki*_*lov 4 nhibernate readonly nhibernate-mapping fluent-nhibernate

我有下一个实体:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要映射我VotedUpCount(因为我有来自NH的错误).我不需要此属性作为我的数据库中的列.

我试过这个并且出错了 Invalid column name '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();
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用流畅的界面映射只读属性,使这个实体工作?

cre*_*mor 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();
Run Code Online (Sandbox Code Playgroud)

  • 测试两个版本:.ReadOnly(); 和.Not.Insert().Not.Update(); 我确定他们不是"完全一样",他们实际上有不同的后果(也许是一个流利的错误)..Not.Insert()Not.Update(); 不能与映射到同一列的第二个字段一起使用,因为在更新时它将在sql子句中列出两次列. (2认同)