nhibernate+自动映射器以及多对多关系

本文关键字:关系 映射 nhibernate+ | 更新日期: 2023-09-27 18:19:39

public class Technology : EntityBase
{
    [NotNullNotEmpty]
    [Length(ColumnMetadata.LongTextLength)]
    public virtual string Name { get; set; }
    public virtual IList<TechnologyTechCategories> TechCategories { get; set; }
}
public class TechnologyTechCategories : EntityBase
{
    [NotNull]
    public virtual Technology Technology { get; set; }
    [NotNull]
    public virtual TechCategory TechCategory { get; set; }
}
public class TechCategory : ReferenceBase
{
}
public class TechDetailModel
{
    public virtual int Id { get; set; }
    [Required]
    public virtual string Name { get; set; }
    [DisplayName("Tech Categories")]
    [Required]
    public int[] TechCategories { get; set; }
    public virtual IEnumerable<SelectListItem> Categories { get; set; }
}

这些是我上面的课程。因此,在绑定到控制器时,我忽略了多选下拉列表的类别集合。但是我无法让自动映射器将 IList 初始化为 int[] 技术类别。有人可以帮忙解决如何将映射放在一起吗?

Mapper.CreateMap<Technology, TechDetailModel>()
                .ForMember(c => c.Categories, option => option.Ignore())
                .ReverseMap();

nhibernate+自动映射器以及多对多关系

您希望在此处将复杂类型自动映射到简单类型,即 IList => int[]

我假设实体库有一些身份属性,例如 ID

因此,以下映射可能适合您:

           Mapper.CreateMap<Technology, TechDetailModel>()
            .ForMember(c => c.Categories, option => option.Ignore())
            .ForMember(c => c.TechCategories, option => option.MapFrom(src => src.TechnologyTechCategories.Select(p => p.TechCategory.Id)));

鉴于从复杂到简单的映射,您将无法在此处使用反向映射。

为了简化映射(和对象模型(,可能值得考虑更改您拥有的多对多映射。你真的需要那个"加入"类吗?如果您在两个类(技术和技术类别(上都指定了 IList,则 FluentNHibernate 自动映射(假设您正在使用此映射(将为您创建连接表。