0

我有以下类结构。

public class SearchTarget : IEntity {
    public virtual String Name { get; set; }
}

public partial class PoliceAssistance {
    public virtual Search SearchWithWarrant { get; set; }
    public virtual Search SearchWithoutWarrant { get; set; }

    public class Search : IEntityComponent {
        public virtual IList<SearchTarget> Targets { get; set; }
    }
}

IEntityComponent确保PoliceAssistance.Search在 Fluent NHibernate 自动映射中被视为一个组件,也就是说,SearchWithWarrant它们SearchWithoutWarrant存储在同一个PoliceAssistance表中。

问题

PoliceAssistance.Search.Targets并且SearchTarget必须具有多对多关系——一个搜索可以包含多个目标,一个目标可以出现在多个搜索中。

如果我在 上指定单向.HasManyToMany()映射PoliceAssistance.Search,当我尝试保存实体时,我会得到“空值违反非空约束”——即使两者都SearchWithWarrantSearchWithoutWarrant实例化并且列表中至少有一个Target

如果我尝试双向指定映射,通过引入public virtual IList<PoliceAssistance.Search> InSearches { get; set; }属性SearchTarget并将其映射到.HasManyToMany().Inverse(),我会收到一个映射错误,指出PoliceAssistance.Search无法引用,因为它未映射(我猜映射为组件的类型不被视为已映射?)。

我应该如何解决这个问题?

4

2 回答 2

0

在与此作斗争之后,我放弃了尝试将映射PoliceAssistance.Search作为组件使用,而是将其变成了一个单独的实体。这需要最少的更改并按预期工作:

// Classes
public class SearchTarget : IEntity {
    public virtual String Name { get; set; }
}

public partial class PoliceAssistance {
    public virtual Search SearchWithWarrant { get; set; }
    public virtual Search SearchWithoutWarrant { get; set; }

    public class Search : IEntity {
        public virtual int Id { get; set; }
        public virtual IList<SearchTarget> Targets { get; set; }
    }
}

// Mapping
public class PoliceAssistanceMap : IAutoMappingOverride<PoliceAssistance> {
    public void Override(AutoMapping<PoliceAssistance> map) {
        map.References(x => x.SearchWithWarrant)
           .Cascade.All();
        map.References(x => x.SearchWithoutWarrant)
           .Cascade.All();
    }
}

public class SearchMap : IAutoMappingOverride<PoliceAssistance.Search> {
    public void Override(AutoMapping<PoliceAssistance.Search> mapping) {
        mapping.HasManyToMany(x => x.Targets);
    }
}
于 2013-05-29T12:35:57.337 回答
0

我对 Fluent NHibernate 引擎一无所知,但总是使用链接表/对象建立多对多连接。所以我希望你会有这样的东西:

public class SearchTarget : IEntity
{
    public virtual String Name { get; set; }
    public virtual IList<Search_SearchTarget_Link> Searches { get; set; }
}

public class Search : IEntityComponent
{
    public virtual IList<Search_SearchTarget_Link> Targets { get; set; }
}

public class Search_SearchTarget_Link : IEntity
{
    public virtual Search search { get; set; }
    public virtual SearchTarget searchtarget { get; set; }
}

public partial class PoliceAssistance
{
    public virtual Search SearchWithWarrant { get; set; }
    public virtual Search SearchWithoutWarrant { get; set; }
}

希望这可以帮助...

于 2013-05-29T09:30:42.490 回答