0

给定以下类结构

public class OrderHeader
{
    public virtual Guid Id { get; set; }
    public virtual IList<IOrderDetail> OrderDetails { get; set; }
    ... 
}

public Interface IOrderDetail
{
     Guid Id { get; set; }
     ...
}

public class OrderDetail : IOrderDetail
{
     public virtual Guid Id { get; set; }
     ...
}

使用以下 NHibernate 代码文件映射。

    public class OrderHeaderMap : ClassMapping<OrderHeader>
{
    public OrderHeaderMap()
    {
        Id(item => item.Id,
            map =>
            {
                map.Generator(Generators.Guid);
            });
        Bag(item => item.OrderDetails,
            cm =>
            {
                cm.Key(k =>
                    {
                        k.Column("IOrderDetailsId");
                        k.NotNullable(true);
                    });
                cm.Inverse(true);
                cm.Cascade(Cascade.All | Cascade.DeleteOrphans);
                cm.Lazy(CollectionLazy.NoLazy);
            },
            r => 
            {
                r.OneToMany(rm =>
                    {
                    });
            });
    }

    public class IOrderDetailsMap : ClassMapping<IScrewlineExpressionBlock>
    {
        public IOrderDetailsMap()
        {
            Id(item => item.Id,
                map =>
                {
                    map.Generator(Generators.Guid);
                });
        }

        public class OrderDetailsMap : JoinedSubclassMapping<OrderDetails>
        {
            public OrderDetailsMap()
            {
                Key(k =>
                    {
                        k.Column(col =>
                            {
                                col.Name(typeof(IOrderDetails).Name + "Id");
                            });
                    });
            }
        }
    }

我遇到的问题是未设置映射详细信息表中标题 Id 字段的 IOrderDetailsId 字段。

用于写入记录的代码是

using (DAO dao = new DAO())
{
foreach (IScrewlineConditionExpression entry in modifiedValues)
{
    IScrewlineConditionExpression header;
    if (entry.Id.Equals(Guid.Empty) || (header = dao.GetById(entry.Id)) == null)
    {
            Guid id = dao.Create(entry);
        header = dao.GetById(id);
    }
    dao.Update(header);
}
}

...
public PK Create(T newItem)
{
    return (PK) Session.Save(newItem);
}

public T Update(T updatedItem)
{
    T result = Session.Merge(updatedItem);
    Session.Flush();
    return result;
}

因此,父记录的 ID 是否应该自动应用于更新/合并的详细记录,或者是我在更新之前必须做的事情。我会认为这是一个困难的提议,因为详细记录上没有可访问的属性要更新。

我更新的方式有什么问题,或者信息的映射方式阻止了 ID 字段的更新?

任何查询都无法找到详细记录,因为生成的 SQL 依赖于 IOrderDetailsId 字段来定位详细记录。

4

0 回答 0