gpt4 book ai didi

c# - Fluent NHibernate 忽略 ClassMap 中的属性,使用 FluentMappings

转载 作者:行者123 更新时间:2023-11-30 13:49:20 27 4
gpt4 key购买 nike

我在我的项目中使用 NHibernate 3.1 和 Fluent NHibernate 作为 ORM。我需要有一个被 Fluent NHibernate 忽略的 POCO 属性。起初,我的帖子可能看起来与 this question 完全相同。 ,但事实并非如此。

我的复杂性首先来自于 POCO 是在与映射不同的程序集中定义的,而且我正在为我的 POCO 使用流畅的映射。我有额外的要求,不要在 session 工厂配置发生的地方编写 ingore-property 代码(这发生在模块外部的集中位置),而是作为定义映射的模块的一部分。理想情况下,我认为正确的位置是具体的 ClassMap 实现,因为它确切地知道如何向 ORM 描述 POCO。

但是,我坚持这一点主要是因为这是我第一次接触 NHibernate 及其流畅的 API。到目前为止,我对它的能力和可扩展性印象非常好,我希望有一种方法可以实现我的需求,将映射相关代码封装在其对应的模块中。

这是我的配置,来自一个集中的地方:

List<Assembly> assemblies = GetModules().Select(x => x.GetType().Assembly).ToList();

ISessionFactory nhibernateSessionFactory = Fluently
.Configure()
.Mappings(m => assemblies.ForEach(asm => m.FluentMappings.AddFromAssembly(asm)))
.Database(
MsSqlConfiguration.MsSql2005
.ShowSql()
.ConnectionString(DatabaseConfig.Instance.ConnectionString))
.ExposeConfiguration(c => new SchemaUpdate(c).Execute(true, true))
.BuildSessionFactory();

我使用继承自 ClassMap 的标准类映射:

public class User
{
public virtual int ID { get; set; }
public virtual String Username { get; set; }
public virtual String Password { get; set; }
public virtual DateTime DateCreated { get; set; }
public virtual DateTime DateModified { get; set; }

// Must ignore
public string ComputedProperty { get { ... } }
}

public class UserMap : ClassMap<User>
{
public UserMap()
{
Table("User");
Id(x => x.ID).GeneratedBy.Identity();
Map(m => m.Username).Not.Nullable().Length(255).UniqueKey("User_Username_Unique_Key");
Map(m => m.Password).Not.Nullable().Length(255);
Map(m => m.DateCreated).Not.Nullable();
Map(m => m.DateModified).Not.Nullable();
}
}

最佳答案

我知道这篇文章有点旧,但我还是发了,因为我没有找到关于这个主题的任何最新文章。我想最简单的方法应该是为我们不想持久保存到表中的每个属性添加一个属性。通过添加一个扩展名来检查它是否具有例如。具有 [NoEntity] 属性。

/// <summary>
/// Tells a single Property to not be persisted to table.
/// </summary>
public class NoEntity : Attribute { }


/// <summary>
/// Extension to ignore attributes
/// </summary>
public static class FluentIgnore
{
/// <summary>
/// Ignore a single property.
/// Property marked with this attributes will no be persisted to table.
/// </summary>
/// <param name="p">IPropertyIgnorer</param>
/// <param name="propertyType">The type to ignore.</param>
/// <returns>The property to ignore.</returns>
public static IPropertyIgnorer SkipProperty(this IPropertyIgnorer p, Type propertyType)
{
return p.IgnoreProperties(x => x.MemberInfo.GetCustomAttributes(propertyType, false).Length > 0);
}
}

在流畅的配置设置中:

            return Fluently.Configure()
.Database(DatabaseConfig)
.Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(typeof(IDependency).Assembly)
.OverrideAll(p => {
p.SkipProperty(typeof(NoEntity));
}).Where(IsEntity)))
.ExposeConfiguration(ValidateSchema)
.ExposeConfiguration(BuildSchema)
.BuildConfiguration();

关于c# - Fluent NHibernate 忽略 ClassMap 中的属性,使用 FluentMappings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9727514/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com