【问题标题】:Fluent NHibernate HasMany Collection ProblemsFluent NHibernate 有很多收集问题
【发布时间】:2009-10-03 03:51:40
【问题描述】:

更新: 似乎将我的映射从 Cascade.All() 更改为 Cascade.AllDeleteOrphan() 解决了我的大部分问题。我仍然必须在 OperatingState 上显式设置 Company 属性,这似乎没有必要,因为它被添加到 Company 实体中,但至少我可以在更新期间使用它。我仍然需要通过创建来测试它。

如果有人能解释一下,那将是一个很大的帮助。

更新 2: 玩了一段时间后,似乎我不必总是指定父实体。

原帖

我有 2 个相关实体

public class Company {
        //... fields
        public virtual IList<OperatingState> OperatingStates { get; set; }
}

public class OperatingState {
        public virtual Company Company { get; set; }// Mapped on CompanyID
        public virtual string State { get; set; }
}

它们的映射如下:

 public class CompanyMap : ClassMap<Company> {
        public CompanyMap() {
        //... fields 
          HasMany(x => x.OperatingStates)
                .Cascade.All()
                .Table("OperatingState");
        }
}
 public class OperatingStateMap : ClassMap<OperatingState> {
        public OperatingStateStateMap() {
            Id(x => x.ID);
            References(x => x.Company);
            Map(x => x.State);
        }
 }

一切都很好,直到我尝试用新的运营状态更新公司

Company company = _repo.GetSingle(123);
 company.OperatingStates.Clear();
 foreach(string state in form["OperatingStates"].Split(',')) {
    company.OperatingStates.Add(new OperatingState(state));
 }
 _repo.Save(company); // calls ISession.SaveOrUpdate

它爆炸了:

无法将值 NULL 插入 列“公司 ID”,表 'ConsumerCartel.dbo.CompanyOperatingState'; 列不允许空值。插入 失败。该声明已 终止。

但是,如果我进行 2 次更改,它会起作用

Company company = _repo.GetSingle(123);
 // don't clear the list this time;
 foreach(string state in form["OperatingStates"].Split(',')) {
    OperatingState os = new OperatingState(state);
    // explicitly setting the company
    os.Company = company;
    company.OperatingStates.Add(os);
 }
 _repo.Save(company); // calls ISession.SaveOrUpdate

这将在旧状态之外添加新状态,这不是我想要的。但是,即使明确设置公司(将其添加到映射列表时我不应该这样做?)如果列表被清除,它也不起作用

此代码已在其他实体上运行,但不适用于此,所以我认为这应该按所写的那样工作。我做错了什么?

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate domain-driven-design bdd


    【解决方案1】:

    您是否尝试过使用 Inverse()?

    HasMany(x => x.OperatingStates)
        .Inverse()
        .Cascade.All()
        .Table("OperatingState");
    

    【讨论】:

    • 感谢您的回答。实际上,.Inverse 帮助我选择了 .AllDeleteOrphan() 选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2010-10-29
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多