Nhibernate 在HNibernate中使用代码映射忽略列

Nhibernate 在HNibernate中使用代码映射忽略列,nhibernate,mapping-by-code,Nhibernate,Mapping By Code,我在NHibernate中使用代码映射。 我得到了一个有几个属性的类。其中一个与数据库中的任何列都不相关,但仍然有getter和setter 我使用ConventionModelMapper而不是ModelMapper。第一个假设所有属性都已映射 我如何告诉NHibernate忽略它?为什么不映射您想要的属性,而保留不需要映射的属性 检查 您可以按照以下方式管理ConventionModelMapper的持久性: mapper.BeforeMapProperty += (mi, property

我在NHibernate中使用代码映射。 我得到了一个有几个属性的类。其中一个与数据库中的任何列都不相关,但仍然有getter和setter

我使用ConventionModelMapper而不是ModelMapper。第一个假设所有属性都已映射


我如何告诉NHibernate忽略它?

为什么不映射您想要的属性,而保留不需要映射的属性

检查

您可以按照以下方式管理ConventionModelMapper的持久性:

mapper.BeforeMapProperty += (mi, propertyPath, map) =>
{
    // Your code here using mi, propertyPath, and map to decide if you want to skip the property .. can check for property name and entity name if you want to ignore it
};
更好的答案是:

mapper.IsPersistentProperty((mi, declared) =>
                                             {
                                                 if (mi.DeclaringType == typeof (YourType) && mi.Name == "PropertyNameToIgnore")
                                                     return false;
                                                 return true;
                                             });

为什么不映射您想要的属性并保留不需要映射的属性

检查

您可以按照以下方式管理ConventionModelMapper的持久性:

mapper.BeforeMapProperty += (mi, propertyPath, map) =>
{
    // Your code here using mi, propertyPath, and map to decide if you want to skip the property .. can check for property name and entity name if you want to ignore it
};
更好的答案是:

mapper.IsPersistentProperty((mi, declared) =>
                                             {
                                                 if (mi.DeclaringType == typeof (YourType) && mi.Name == "PropertyNameToIgnore")
                                                     return false;
                                                 return true;
                                             });

如果在NHibernate映射中未提及应忽略的属性,NHibernate将忽略它。

如果在NHibernate映射中未提及应忽略的属性,NHibernate将忽略它。

我发现只需创建一个属性,将该属性附加到属性,并在mapper.IsPersistentProperty方法中检查它。大概是这样的:

class IngnoreAttribute : Attribute
{
}

class Foo
{
    [Ignore]
    public virtual string Bar { get; set; }
}

mapper.IsPersistentProperty((mi, declared) => mi.GetCustomAttribute<IgnoreAttribute>() == null);
class IngNoreatAttribute:属性
{
}
福班
{
[忽略]
公共虚拟字符串栏{get;set;}
}
mapper.IsPersistentProperty((mi,声明)=>mi.GetCustomAttribute()==null);

这样,我就不必在映射代码中保留要忽略的属性列表。

我发现只需创建一个属性,将该属性附加到属性,然后在mapper.IsPersistentProperty方法中检查它就更容易了。大概是这样的:

class IngnoreAttribute : Attribute
{
}

class Foo
{
    [Ignore]
    public virtual string Bar { get; set; }
}

mapper.IsPersistentProperty((mi, declared) => mi.GetCustomAttribute<IgnoreAttribute>() == null);
class IngNoreatAttribute:属性
{
}
福班
{
[忽略]
公共虚拟字符串栏{get;set;}
}
mapper.IsPersistentProperty((mi,声明)=>mi.GetCustomAttribute()==null);


这样,我就不必在映射代码中保留要忽略的属性列表。

如果不想避免这个问题,在NHibernate实体中不保留未映射的属性不是更好吗?也许viewmodel更适合作为自定义属性的主视图?实际上,它是其中一个映射属性的包装器。我有一个带有属性“Entity”的基类“Notification”,该属性映射为Any。我有一个属性为“Order”的子类“NewOrderNotification”,它只是围绕“Entity”的更类型的包装器检查[this][1]问题[1]:Thx用于链接,但我不使用Fluent NHibernate。我使用了NHibernate本身的嵌入功能,称为“代码映射”。@VasiliyShiryaev还查看了另一种解决方案,不希望避免这个问题,在您的NHibernate实体中没有未映射的属性不是更好吗?也许viewmodel更适合作为自定义属性的主视图?实际上,它是其中一个映射属性的包装器。我有一个带有属性“Entity”的基类“Notification”,该属性映射为Any。我有一个属性为“Order”的子类“NewOrderNotification”,它只是围绕“Entity”的更类型的包装器检查[this][1]问题[1]:Thx用于链接,但我不使用Fluent NHibernate。我使用了NHibernate本身的嵌入功能,称为“代码映射”。@VasiliyShiryaev还可以查看其他解决方案,这是正确的,但仅适用于xml。自动映射假定默认情况下映射了所有属性。此外,我并不是真的对每个实体都使用类映射。我只是有一套约定,让NHibernate自动映射我的所有类。你使用FluentNhibernate??如果是这样,请检查以下内容:。覆盖(map=>{map.IgnoreProperty(x=>x.YourProperty);})*对于xml和ModelMapper,为true。但我使用ConventionModelMapper。不,它不是流利的NHibernate。我们无法找到如何使用mapper.BeforeMapProperty来决定是否使用map属性。根据这一点,没有简单的方法可以忽略属性。编辑我的答案以获得更好的解决方案这是正确的,但仅适用于xml。自动映射假定默认情况下映射了所有属性。此外,我并不是真的对每个实体都使用类映射。我只是有一套约定,让NHibernate自动映射我的所有类。你使用FluentNhibernate??如果是这样,请检查以下内容:。覆盖(map=>{map.IgnoreProperty(x=>x.YourProperty);})*对于xml和ModelMapper,为true。但我使用ConventionModelMapper。不,它不是流利的NHibernate。我们无法找到如何使用mapper.BeforeMapProperty来决定是否使用map属性。根据这一点,没有简单的方法可以忽略属性。编辑我的答案以获得更好的解决方案这是正确的,但仅适用于xml映射。默认ConventionModelMapper假设所有属性都已映射。*对于xml和ModelMapper为true。它为true,但仅对于xml映射。默认约定ModelMapper假定所有属性都已映射。*对于xml和ModelMapper为true。