1

「Entity」という基本クラスと、「Project」、「Company」、「Contact」というサブクラスがあり、基本クラス「Entity」を継承し、WCF REST アプリケーションで Fluent NHibernate にマップされています。

以前は、エンティティ クラスでこのポリモーフィックな関連付けは必要ありませんでしたが、最近、このクラスを多対多の関係に関連付ける必要があったため、これを行うことにしました。これは私の基本クラスのマッピングです:

        public crmEntityMap()
    {
        Table("crmEntity");
        LazyLoad();
        Id(x => x.ID).GeneratedBy.Identity().Column("ID");
        Map(x => x.instanceID).Not.Nullable().Column("InstanceID");
        Map(x => x.comment).Column("Comment").Length(500);
        HasManyToMany(x => x.RelatedEntities)
            .AsList(i => i.Column("`Index`"))
            .ParentKeyColumn("ParentID")
            .ChildKeyColumn("ChildID")
            .BatchSize(100)
            .Not
            .LazyLoad()
            .Fetch.Join()
            .Cascade.None();
        DiscriminateSubClassesOnColumn("Type");
    }

プロジェクトのマッピング:

    public class crmProjectMap : SubclassMap<crmProject>
{

    public crmProjectMap() {
        Table("crmProjects");
        LazyLoad();
        Map(x => x.name).Column("Name").Length(50);
        Map(x => x.initialDate).Column("InitialDate");
        Map(x => x.deadline).Column("Deadline");
        Map(x => x.isClosed).Column("IsClosed");
        References(x => x.assignedToUser).Column("AssignedToUserID").NotFound.Ignore();
    }
}

私の WCF REST サービスでシリアル化するための変換コード:

            public static DTO.Project GetProject(int projectId, int instanceId)
        {
            crmUser user = null;
            return Provider.GetSession().QueryOver<crmProject>()
                .Fetch(x => x.assignedToUser).Eager()
                .JoinAlias(x => x.assignedToUser, () => user, JoinType.LeftOuterJoin)
                .Where(c => c.ID == projectId)
                .And(c => c.instanceID == instanceId)
  .Select(Projections.ProjectionList()
        .Add(Projections.Property("ID"), "ID")
        .Add(Projections.Property("instanceID"), "instanceID")
        .Add(Projections.Property("name"), "name")
        .Add(Projections.Property("comment"), "comment")
        .Add(Projections.Property("isClosed"), "isClosed")
        .Add(Projections.Property("initialDate"), "initialDate")
        .Add(Projections.Property("deadline"), "deadline")
        .Add(Projections.Property(() => user.userID), "assignedToUserID")
        //Add Related Entities?
  ).TransformUsing(Transformers.AliasToBean<DTO.Project>())
  .SingleOrDefault<DTO.Project>();
        }

しかし、ご覧のとおり、ここに RelatedEntities を追加する必要がありますが、その方法がわかりません。RelatedEntity は、Entity クラスを継承する "Company"、"Contact"、または "Project" である可能性があるためです。これを DTO.Project クラスで定義し、データを変換する必要があります。

4

1 に答える 1

0

これは、その問題に対する私の修正です。誰かがそれを改善できれば幸いです。

        DTO.Project proj = new DTO.Project();
        crmUser user = null;
        crmEntity ent =null;
        using (ISession session = Provider.SessionFactory.OpenSession())
        {
            proj = session.QueryOver<crmProject>()
                .Fetch(x => x.assignedToUser).Eager()
                .JoinAlias(x => x.assignedToUser, () => user, JoinType.InnerJoin)
                .Where(c => c.ID == projectId)
                .And(c => c.instanceID == instanceId)
  .Select(Projections.ProjectionList()
        .Add(Projections.Property("ID"), "ID")
        .Add(Projections.Property("instanceID"), "instanceID")
        .Add(Projections.Property("name"), "name")
        .Add(Projections.Property("comment"), "comment")
        .Add(Projections.Property("isClosed"), "isClosed")
        .Add(Projections.Property("initialDate"), "initialDate")
        .Add(Projections.Property("deadline"), "deadline")
        .Add(Projections.Property(() => user.userID), "assignedToUserID")
  ).TransformUsing(Transformers.AliasToBean<DTO.Project>())
  .SingleOrDefault<DTO.Project>();

            proj.RelatedEntities = session.QueryOver<crmProject>()
                .Fetch(x => x.RelatedEntities).Eager()
                .Where(c => c.ID == projectId).JoinAlias(x=>x.RelatedEntities,()=>ent,JoinType.InnerJoin)
  .Select(Projections.ProjectionList()
        .Add(Projections.Property(()=>ent.ID), "ID")
        .Add(Projections.Property(() => ent.type), "Type")
  ).TransformUsing(Transformers.AliasToBean<DTO.EntityRelation>()).List<DTO.EntityRelation>();
        }
        return proj;
于 2012-04-22T13:20:16.787 に答える