使用接口通过代码进行NHibernate映射

时间:2013-06-26 06:57:28

标签: nhibernate-mapping

给出以下类结构

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字段来查找详细记录。

0 个答案:

没有答案