gpt4 book ai didi

单向一对多关系的 NHibernate 配置

转载 作者:行者123 更新时间:2023-12-03 08:14:21 25 4
gpt4 key购买 nike

我正在尝试建立如下关系。每个大师 项目有一个或多个 详情 项目:

public class Detail {
public virtual Guid DetailId { get; set; }
public virtual string Name { get; set; }
}
public class Master {
public virtual Guid MasterId { get; set; }
public virtual string Name { get; set; }
public virtual IList<Detail> Details { get; set; }
}

和映射:
public class MasterMap : ClassMap<Master> 
{
public MasterMap()
{
Id(x => x.MasterId);
Map(x => x.Name);
HasMany(x => x.Details).Not.KeyNullable.Cascade.All();
}
}
public class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Id(x => x.Id);
Map(x => x.Name);
}
}

大师 数据库表是:
masterId   uniqueidentifier NOT NULL
name nvarchar(max) NULL

详情 是:
DetailId   uniqueidentifier NOT NULL
name nvarchar(max) NULL
MasterId uniqueidentifier NULL
foreign key (masterId) references [Master]

我真的不关心从 Detail 到 Master 的链接——换句话说,Detail 对象本身对我的域层不感兴趣。它们将始终通过它们的 Master 对象访问。

使用这样的代码:
Master mast = new Master 
{
MasterId = new Guid(),
Name = "test",
Details = new List<Detail>
{
new Detail { .DetailId = new Guid(), .Name = "Test1" },
new Detail { .DetailId = new Guid(), .Name = "Test1" }
}
};

using (transaction == Session.BeginTransaction)
{
Session.Save(mast);
transaction.Commit();
}

这很好用,除了 this post 中概述的疯狂限制。 : NHibernate 执行 INSERT 并将 Detail.MasterId 首先设置为 NULL,然后执行 UPDATE 将其设置为真正的 MasterId。

真的,我不想要带有 NULL MasterIds 的 Detail 条目,所以如果我将 MasterId 字段设置为 NOT NULL,INSERT 到 Detail 将失败,因为正如我所说 NHibernate 试图放入 MasterId = NULL。

我想我的问题归结为:

如何让上述代码示例与我现有的域模型一起使用(例如,不添加 Detail.Master 属性),并且数据库中的 Detail.MasterId 字段设置为 NOT NULL?

有没有办法让 Nhibernate 将正确的 MasterId 放在初始 INSERT 中,而不是之后运行 UPDATE?这个设计决定是否有理由? ——我很难理解为什么会这样。

最佳答案

NH3 及更高版本允许在单向一对多映射的情况下更正保存实体,而不会烦人 save null - save - update循环,如果您同时设置 not-null="true"inverse="false" 上在 <一对多>

FluentNHibernate 代码片段:

public class MasterMap : ClassMap<Master> 
{
public MasterMap()
{
Id(x => x.MasterId);
Map(x => x.Name);
HasMany(x => x.Details)
.Not.Inverse() //these options are very
.Not.KeyNullable() //important and work only if set together
.Not.KeyUpdate() //to prevent double update
.Cascade.All();
}
}

关于单向一对多关系的 NHibernate 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4466153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com