应该是只读db-field的属性(Fluent NHibernate Automapping)

Dan*_* W. 1 nhibernate fluent automapping

我使用Fluent NHibernate和自动功能.现在我正在寻找像配置,设置,自定义属性 - 无论如何 - 将实体属性声明为"ReadOnlyFromDb"

在MsSql数据库中,我在其中一个表中使用计算列,其中根据特定数据行的某些其他值计算值.现在我已将实体类中的此列声明为

public virtual int STATUS { get; private set; }
Run Code Online (Sandbox Code Playgroud)

获取表格的具体数据一切正常.STATUS使用数据表中的特定值填充属性.

当我尝试SaveUpdate()特定对象时出现问题.我总是得到例外

A computed column cannot be the target of an INSERT or UPDATE statement
Run Code Online (Sandbox Code Playgroud)

这对我的理解是正确的 - 以及它应该如何;)!

基本上我正在寻找配置,设置,自定义属性 - 无论如何 - 要说

Hey Fluent NHibernate - 获取特定属性propertyName但不插入/更新属性propertyName

有类似的东西吗?或者这种情况是否存在解决方法?我搜索了流利的nhibernate wiki,但没有找到一个smilliar案例.

我希望有人已经面对并解决了这个问题!

以下是我创建会话的代码片段(可能有帮助):

    public static ISessionFactory GetNHibernateSession()
    {
        if (nhibernateSession != null)
            return nhibernateSession;

        if (ConfigurationManager.AppSettings[msSqlConnectionString] == null || ConfigurationManager.AppSettings[msSqlConnectionString] == String.Empty)
            throw new NullReferenceException(String.Format("AppSetting '{0}' must not be null!", msSqlConnectionString));

        //nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString]))
        //                              .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<T_ABWEICHUNGEN>().IgnoreBase<BaseClass>)).BuildSessionFactory();

        nhibernateSession = Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.ConnectionString(ConfigurationManager.AppSettings[msSqlConnectionString]))
                                   .Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(System.Reflection.Assembly.GetExecutingAssembly())
                                   .Override<T_ABWEICHUNGEN>(map =>map.Map(d => d.A08_STATUS_FILE).Length(2147483647))
                                   .IgnoreBase(typeof(BaseClass))
                                   .IgnoreBase(typeof(IDColumn))
                                   .IgnoreBase(typeof(MsSqlQuery))
                                   .IgnoreBase(typeof(MsSqlParamCollection))
                                   .IgnoreBase(typeof(AbweichungStatus))
                                   )).BuildSessionFactory();
        return nhibernateSession;
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢到目前为止的回应 - 迄今为止帮助了我.但是 - 有没有办法让这个问题更"动态"地解决?

例如:

我想声明一个名为[ReadOnlyDbField]now 的自定义属性,声明具有此cusomt属性的实体的所有属性:只需读取此值,不要更新/插入它.

基本上我想在配置中说

Map all properties with the custom attribute [ReadOnlyDbField] to Not.Insert().Not.Update()
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个?

Fir*_*iro 5

.Override<Entity>(map => map.Map(d => d.STATUS).Not.Insert().Not.Update())
Run Code Online (Sandbox Code Playgroud)

更新:已编辑问题的帐户

public class ReadonlyDbFielConvention : AttributePropertyConvention<ReadOnlyDbField>
{
    protected override void Apply(ReadOnlyDbField attribute, IPropertyInstance instance)
    {
        instance.Not.Insert();
        instance.Not.Update();
    }
}
Run Code Online (Sandbox Code Playgroud)