【问题标题】:Fluent NHibernate One to One SaveFluent NHibernate 一对一保存
【发布时间】:2012-12-05 13:12:32
【问题描述】:

我有 3 个课程:

public class WorkEntity
{
    public virtual int WorkId { get; set; }
    public virtual OrderExtensionEntity OrderExtension { get; set; }
}

public class OrderExtensionEntity
{
    public virtual int Id { get; set; }
    public virtual WorkEntity Work { get; set; }
    public virtual IList<IssueInformation> Issues { get; set; }
}

public class IssueInformationEntity
{
    public virtual int Id { get; set; }
    public virtual long WorkId { get; set; }
}

它们被映射:

public class WorkMap : ClassMap<WorkEntity>
{
    public WorkMap()
    {
        Id(x => x.WorkId).Column("ID_ZLECENIE").GeneratedBy.Sequence("SEQ_TAE_ZLECENIE");
        HasOne(x => x.OrderExtension).Constrained();
     }
}

public class OrderExtensionMap : ClassMap<OrderExtensionEntity>
{
    public OrderExtensionMap()
    {
        LazyLoad();

        Id(x => x.Id).Column("ID_ZLECENIE").GeneratedBy.Foreign("Work");
        HasMany(x => x.IssueInformation).KeyColumn("FK_ZLECENIE");
    }
}

public class IssueInformationMap : ClassMap<IssueInformationEntity>
{
    public IssueInformationMap()
    {
       Id(x => x.Id).Column("ID_ZAD_ROZ_ADRES").GeneratedBy.Sequence("SEQ_ZAD_ROZ_ADRES");

        Map(x => x.WorkId).Column("FK_ZLECENIE").Not.Nullable();
    }
}

当我在数据库 (Oracle) 上创建记录时,我可以从表中获取所有信息。 但我无法使用以下方法保存 OrderExtensionEntity:

var orderExtension = new OrderExtension();
orderExtension._some_variables_like_strings_to_be_saved_

Session.SaveOrUpdate(orderExtension)

如果我尝试这样做,它会告诉我“未解决的属性工作”和其他一些错误:

orderExtension.Work = new WorkEntity() { WorkId = 12345 };

【问题讨论】:

    标签: c# oracle nhibernate fluent-nhibernate fluent


    【解决方案1】:

    试试这个映射。这就是我的一对一关系的样子。

    public class WorkMap : ClassMap<WorkEntity>
    {
        public WorkMap()
        {
            Id(x => x.WorkId).Column("ID_ZLECENIE").GeneratedBy.Sequence("SEQ_TAE_ZLECENIE");
            HasOne(x => x.OrderExtension)
                .Cascade.All();
         }
    }
    
    public class OrderExtensionMap : ClassMap<OrderExtensionEntity>
    {
        public OrderExtensionMap()
        {
            LazyLoad();
    
            Id(x => x.Id).Column("ID_ZLECENIE").GeneratedBy.Foreign("Work");
            HasOne(x => x.Work).Constrained();
            HasMany(x => x.IssueInformation).KeyColumn("FK_ZLECENIE");
        }
    }
    

    【讨论】:

    • 不。它抛出“执行此方法调用的事务被异步中止。”也许我从一对一更改为一对多并像 One 一样使用它?
    • 好吧,我不确定我是否理解上面的示例。看起来您正在尝试自行保存 OrderExtension。没有 Work 对象就不能存在 OrderExtension。如果这不是您的意图,则映射不正确。我认为您会将新的 OrderExtension 对象链接到新的 Work 对象或持久的 Work 对象并保存 Work 对象。
    • 此外,您在“交易...”上方陈述的错误似乎不是与映射相关的问题。
    • 保存 Work 对象可以使其工作。但为了可靠性,我想单独存储这个实体。如何更改映射以实现该效果?
    • @DanielGralak 如果OrderExtensionEntity 可以在没有 Work 对象的情况下独立存在,那么这不是一对一的关系。如果 OrderExtensionEntity 和 Work 之间的关系是可选的,那么 OrderExtensionEntity 表中的主键应该是单独的,并且与 Work 的关系应该通过 Work 表的可为空的外键来表示。这样您就不必拥有相关的 Work 对象。
    猜你喜欢
    • 2010-10-06
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多