0

我有一个由代码映射的按层次结构的表结构,以及一个包含数据的表 - 116 行。最初,该表(和整个数据库)是使用 Entity Framework Code First 方法创建的。由于某些原因,我从 EF 切换到 NH,并尝试从提到的表中获取数据导致 115 个正确创建的对象,并且只有一行导致代理对象的基类型错误。我试图找出其他相似行和错误行之间的差异(有 30 行具有相同的鉴别器值),但我失败了。因此,问题是 - 我可以使用什么调试技术来解决我的问题?

下面是我如何从表中加载数据的小片段:

var more = _dbSession.Query<BaseTreeNode>()
                .Where(tn => !tn.IsTemplate)
                .OrderBy(tn => tn.Id)
                .ToList();

这是一个映射:

public class BaseTreeNodeMapping : ClassMapping<BaseTreeNode> {
        public BaseTreeNodeMapping() {
            Debug.WriteLine("{0}", GetType());
            Table("BaseTreeNodes");
            Id(x => x.Id);

            Discriminator(x => {
                x.Force(true);
                x.Formula("arbitrary SQL expression");
                x.Insert(true);
                x.Length(128);
                x.NotNullable(true);
                x.Column("Discriminator");
            });

            Property(p => p.Name);
            Property(x => x.SortOrder);
            Property(x => x.IsTemplate);
            Property(x => x.ArchiveUid);
            Property(x => x.LastChangedAt, x => x.Lazy(false));
            Property(x => x.LastChangedBy);

            // Complex Properties 
            ManyToOne(x => x.Parent, p => {
                p.Column("Parent_Id");
                p.Class(typeof(BaseTreeNode));
                p.NotNullable(false);
            });
            ManyToOne(x => x.ComplexNode, cn => {
                cn.Column("ComplexNode_Id");
                cn.NotNullable(true);
            });
            ManyToOne(x => x.ComplexStructure, cn => {
                cn.Column("ComplexStructure_Id");
                cn.NotNullable(true);
            });
            ManyToOne(x => x.ContentNode, cn => {
                cn.Column("ContentNode_Id");
                cn.NotNullable(true);
            });
        }

        public class EntityMapping : SubclassMapping<Entity> {
            public EntityMapping() {
                DiscriminatorValue("Entity");
                ManyToOne(p => p.TypeCode, t => {
                    t.Column("TypeCode_Id");
                    t.Class(typeof(TypeCode));
                    t.Fetch(FetchKind.Join);
                    t.NotNullable(true);
                    t.Lazy(LazyRelation.NoLazy);
                });
                Property(p => p.ArchivedFrom);
            }
        }

4

1 回答 1

0

原因(我猜)是因为第一行之一通过其父属性引用代理对象,并且由于它具有基本类型并且不急切地获取 NHibernate 只能创建此基本类型的代理来表示它。稍后它会找到与 row 相同的对象并分发对它的现有引用(代理)。

一个简单的解决方法是禁用 Parent 属性的 LazyLoading:

ManyToOne(x => x.Parent, p => {
            p.Column("Parent_Id");
            p.Class(typeof(BaseTreeNode));
            p.Lazyload(false);
            p.NotNullable(false);
        });
于 2015-01-26T07:12:32.687 回答