繁体   English   中英

使用Fluent nHibernate将SQL Server时间戳列自动映射到byte []

[英]Automapping SQL Server timestamp columns to byte[] using Fluent nHibernate

我开始在一个项目上使用Fluent nHibernate,并试图使自动化工作。 当时我坚持将数据库的时间戳字段映射到字节数组。 我们使用SQL Server 2008作为数据库,我们不是从代码生成数据库。

我有的:

public class Entity
  {
        public virtual Guid RowID { get; protected set; }
        public virtual byte[] ChangeCheck { get; protected set; }
        public virtual string Data { get; set; }
  }

我们的数据库约定是将版本字段命名为“ChangeCheck”。 我无法找到我覆盖DefaultAutomappingConfiguration默认行为的位置,以使用ChangeCheck作为自动生成的版本字段。

是否有可能获得DefaultAutomappingConfiguration子类以将所有ChangeCheck字段自动化为版本字段?

感谢您的任何指示和帮助。

可选方案:

鉴于我使用'ChangeCheck'为所有实体创建了一个自动覆盖,我可以执行以下操作:

 private class ChangeCheckVersionConvention : IVersionConvention
    {
        public void Apply(IVersionInstance instance)
        {
            instance.Column("ChangeCheck");
            instance.Generated.Always();
            instance.UnsavedValue(null);
        }
    }

public class EntityOverride : IAutoMappingOverride<IssueReport>
    {
        public void Override(AutoMapping<IssueReport> mapping)
        {
            mapping.Version(m => m.ChangeCheck);
        }
     }

 //....
 var persistenceModel = AutoMap.AssemblyOf<MyConfiguration>(new MyConfiguration())
            .UseOverridesFromAssemblyOf<MyConfiguration>()
            .Conventions.Add<ChangeCheckVersionConvention>();

哪个有效,但我无法弄清楚如何删除覆盖以将ChangeCheck列设置为我的版本列,而不必覆盖我的所有实体。

在没有到达任何地方后,我决定逐步完成Fluent nHibernate代码,看看发生了什么。 然后我找到了如何设置'DefaultAutomappingConfiguration'并创建了我自己的版本:

public class MyAutomappingStoreConfiguration : DefaultAutomappingConfiguration
{
    public override IEnumerable<IAutomappingStep> GetMappingSteps(AutoMapper mapper, IConventionFinder conventionFinder)
    {
        return new IAutomappingStep[]
        {
            new IdentityStep(this),
            new MyChangeCheckVersionStep(this),
            new ComponentStep(this, mapper),
            new PropertyStep(conventionFinder, this),
            new HasManyToManyStep(this),
            new ReferenceStep(this),
            new HasManyStep(this)
        };
    }
}

注意MyChangeCheckVersionStep是不同的。 然后我实现了一个VersionStep类,它将ChangeCheck添加到假定为Version列的列名列表中:

public class MyChangeCheckVersionStep: IAutomappingStep
{
    private static readonly IList<string> validNames 
         = new List<string> { "version", "timestamp", "changecheck" };
    private static readonly IList<Type> validTypes
         = new List<Type> { typeof(int), typeof(long), typeof(TimeSpan), typeof(byte[]) };

    private readonly IAutomappingStep defaultVersionStep;

    public MyChangeCheckVersionStep(IAutomappingConfiguration cfg)
    {
        this.defaultVersionStep = new VersionStep(cfg);
    }

    public bool ShouldMap(Member member)
    {
        return validNames.Contains(member.Name.ToLowerInvariant())
           && validTypes.Contains(member.PropertyType);
    }

    public void Map(ClassMappingBase classMap, Member member)
    {
        defaultVersionStep.Map(classMap, member);
    }
}

除了ShouldMap之外 ,该类基本上调用了defualt VersionStep实现。

现在,我不再需要为每个实体创建覆盖以使版本正常工作。 还要注意,我仍然使用ChangeCheckVersionConvention - 它是我不再需要的每个实体类的覆盖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM