C# 单向关联是否会通过NHibernate导致不需要的外键字段

C# 单向关联是否会通过NHibernate导致不需要的外键字段,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,更新 下面添加了映射 问题摘要 我有一个包含许多必需外键字段的数据库和一个包含许多单向关联的代码库。我想使用NHibernate,但据我所知,我要么必须使数据库中的外键字段为空(这不是一个现实的选项),要么将关联更改为双向(也不理想)。还有我错过的其他选择吗 背景 我加入了一个使用NHibernate将表1:1映射到所谓的“技术”对象的项目。数据检索后,对象映射到实际的域模型(AutoMapper样式,实现方式不同)。我知道这是一个不必要的步骤,我想向团队建议删除它。然而,我遇到了一个问题 域模

更新 下面添加了映射

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

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

域模型包含许多单向关联:案例对象具有与案例关联的人员列表,但这些人员没有对案例对象的引用。在基础数据库方案中,Person表具有引用案例Id的必需外键字段。数据模型:

[ERD]
               PERSON
CASE           Id*            Ids are generated by the DB
Id*    <--FK-- CaseId*        * denotes required fields
(other)        (other)         
然而,这将涉及对现有代码库的重大更改,因此我更喜欢替代方案(如果存在的话)。我已经讨论过组件映射,但这不适合,因为我们模型中的大多数关联都不是实际的(UML)组合。还有其他我错过的选择吗?蒂亚

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

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

public class Case : DomainEntity
{
  public virtual IList<Person> Persons { get; set; }
}
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();
    }
}
公共类案例映射:类映射
{
公共案件测绘()
{
不是。懒汉();
Id(c=>c.Id).GeneratedBy.Identity();
Map(x=>x.Code).Not.Nullable().Length(20);
Map(x=>x.Name).Not.Nullable().Length(100);
有很多人(x=>x人)
.AsBag()
.KeyColumn(“CaseId”)
.ForeignKeyConstraintName(“FK_人_案”)
.Cascade.AllDeleteOrphan();
}
}
如果我对测试数据库使用SessionSource.BuildSchema,这将生成一个带有可空CaseId列的Person表。我还没有找到一种方法来处理没有双向关联的不可为空的CaseId字段。执行的(伪)SQL语句:

  • 插入到
    案例中
  • 选择@标识
  • 插入到
    Person
    /*(除CaseId外的所有列)*/
  • 选择@标识
  • 更新
    Person
    SET CaseId=?其中Id=@p0=2,@p1=1

  • 我想你在这里可能不走运。州政府的文件:

    如果关联的列声明为NOTNULL,则NHibernate在创建或更新关联时可能会导致违反约束。为了防止此问题,必须使用双向关联,将多值端(集合或包)标记为reverse=“true”

    LOL。。。在一段关系中,大多数人在提到单向关系时忽略了多值目的!您如何映射案例中的人员属性?
    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();
        }
    }