我需要根据属性忽略属性。
下面你会看到一些代码(我的项目的一小段内容),你会对我想要完成的事情有所了解。
我正在努力的是将此规则添加到我的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();
}
}
答案 0 :(得分:2)
有关详细信息,请参阅此page。
您可以使用谓词
来忽略属性.OverrideAll(map =>
{
map.IgnoreProperties(x => x.Name.Contains("Something"));
});
只需修改谓词以使用反射来确定是否定义了属性。
更新:
这可以在ClassMap
中使用。为了全局应用该约定,应用实施IPropertyConventionAcceptance
接口的约定(请参阅this或this):
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);
}
}