gpt4 book ai didi

c# - 单向关联是否通过 NHibernate 导致非必需的外键字段

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:02 25 4
gpt4 key购买 nike

更新在下面添加了映射

问题总结我有一个包含许多必需外键字段的数据库和一个包含许多单向关联的代码库。我想使用 NHibernate,但据我所知,我要么必须使数据库中的外键字段为 NULLable(这不是一个现实的选择),要么将关联更改为双向(也不理想)。还有其他我错过的选择吗?

背景我加入了一个项目,该项目使用 NHibernate 将表 1:1 映射到所谓的“技术”对象。数据检索后,对象被映射到实际的域模型(AutoMapper 样式,实现方式不同)。我知道这是一个不必要的步骤,我想向团队提议将其删除。但是,我遇到了一个问题。

域模型包含许多单向关联:Case 对象有一个与案例相关联的人员列表,但这些人员不持有对 Case 对象的引用。在底层数据库方案中,Person 表有一个引用案例 ID 的必填外键字段。数据模型:

[ERD]
PERSON
CASE Id* Ids are generated by the DB
Id* <--FK-- CaseId* * denotes required fields
(other) (other)

领域模型如下所示:

public class Person : DomainEntity
{ // DomainEntity implements Id. Non-essential members left out }

public class Case : DomainEntity
{
public virtual IList<Person> Persons { get; set; }
}

在 Case 上调用 session.Save() 会导致数据库错误(插入 Person 时需要 CaseId),因为 NHibernate 首先插入 Person 条目,然后是 Case 条目,最后更新 Person 中的 CaseId 列条目。如果数据库中的 CaseId 列更改为非必需(允许 NULL),则一切正常......但是,目前无法进行更改(数据库模型由多个应用程序共享至少另一个)年)。我发现让 NHibernate 正确执行数据库操作的唯一方法是将关联更改为双向,即将 Person 更改为

public class Person : DomainEntity
{
public virtual Case Case { get; set; }
}

然而,这将涉及对现有代码库的重大更改,因此我更喜欢替代方案(如果存在的话)。我玩过组件映射,但这不太合适,因为我们模型中的大多数关联都不是实际的 (UML) 组合。还有其他我错过的选择吗? TIA!

编辑Case 的 (Fluent) 映射如下所示:

public class CaseMapping : ClassMap<Case>
{
public CaseMapping()
{
Not.LazyLoad();

Id(c => c.Id).GeneratedBy.Identity();
Map(x => x.Code).Not.Nullable().Length(20);
Map(x => x.Name).Not.Nullable().Length(100);
HasMany<Person>(x => x.Persons)
.AsBag()
.KeyColumn("CaseId")
.ForeignKeyConstraintName("FK_Person_Case")
.Cascade.AllDeleteOrphan();
}
}

如果我将 SessionSource.BuildSchema 用于测试数据库,则会生成一个带有可为空 CaseId 列的 Person 表。我还没有找到一种方法可以在没有双向关联的情况下使用不可为空的 CaseId 字段。执行的(伪)SQL语句:

  1. 插入案例...
  2. 选择@@identity
  3. INSERT INTO Person/*(除 CaseId 外的所有列)*/
  4. 选择@@identity
  5. UPDATE Person SET CaseId = ?其中 Id = ?;@p0 = 2,@p1 = 1

最佳答案

我想你可能在这里运气不好。 http://nhibernate.info/doc/nh/en/index.html#collections-onetomany 处的文档状态:

如果关联的列声明为 NOT NULL,NHibernate 在创建或更新关联时可能会导致约束冲突。为防止此问题,您必须使用标记为 inverse="true"的多值端(集合或包)的双向关联

关于c# - 单向关联是否通过 NHibernate 导致非必需的外键字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1426767/

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