Fluent配置,根据装饰属性忽略属性

时间:2014-03-07 11:04:08

标签: c# fluent-nhibernate

我需要根据属性忽略属性。

下面你会看到一些代码(我的项目的一小段内容),你会对我想要完成的事情有所了解。

我正在努力的是将此规则添加到我的bhibernate配置中,即,如果属性具有[IgnoreProperty]属性,则flientnhibernate不应将其包含在正在生成的模式中。

我希望尽可能通用,这样我就不必为每个实体创建一个类映射。

有没有办法将这种功能直接包含在配置中?如果是这样,我真的很感激一个例子

public class Person
{
    public virtual string Name { get; set; }
    public virtual string Surname { get; set; }

    [IgnoreProperty]
    public string FullName
    {
        get { return string.Format("{0} {1}", this.Name, this.Surname); }
    }
}

public class IgnorePropertyAttribute : Attribute
{
}

public class SessionManager
{
    private static ISessionFactory GetFactory()
    {
        return
        Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.UsingFile(Path.Combine(@"C:\temp","MyDatabaseName.db")))
            .Mappings(
            m =>
            m.AutoMappings.Add(AutoMap.AssemblyOf<Person>(t => t.Namespace.StartsWith(typeof(Person).Namespace))))
            .ExposeConfiguration(BuildSchema)
            .BuildSessionFactory();
    }
}

2 个答案:

答案 0 :(得分:2)

有关详细信息,请参阅此page

您可以使用谓词

来忽略属性
.OverrideAll(map =>  
{  
  map.IgnoreProperties(x => x.Name.Contains("Something"));
});

只需修改谓词以使用反射来确定是否定义了属性。

更新: 这可以在ClassMap中使用。为了全局应用该约定,应用实施IPropertyConventionAcceptance接口的约定(请参阅thisthis):

public MyConvetion : IPropertyConventionAcceptance 
{
  public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
  {
    criteria.Expect(x => boolValue); // [is there a IgnoreAttribute]);
  }
}

This页面会告诉您有关约定以及如何全局应用这些约定的更多信息。

答案 1 :(得分:0)

以下代码将阻止在数据库中生成该列。不要忘记将配置添加到映射中。

public class AutomappingConfiguration : DefaultAutomappingConfiguration
{
    public override bool ShouldMap(Member member)
    {
        if (member.MemberInfo.GetCustomAttributes(typeof(IgnorePropertyAttribute), true).Length > 0)
        {
            return false;
        }
        return base.ShouldMap(member);
    }
}