gpt4 book ai didi

nhibernate - 流畅的 NHibernate : How to create one-to-many bidirectional mapping?

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

基本问题:如何在 Fluent NHibernate 中创建双向一对多映射?

详细信息:

我有一个带有许多子对象的父对象。就我而言,子级没有父级是没有意义的,因此在数据库中,我希望父级的外键具有 NOT NULL 约束。我正在从 Fluent NHibernate 映射自动生成数据库。

我有一个带有许多子对象的父对象,如下所示:

public class Summary
{
public int id {get; protected set;}

public IList<Detail> Details {get; protected set;}
}

public class Detail
{
public int id {get; protected set;}

public string ItemName {get; set;}

/* public Summary Owner {get; protected set;} */ //I think this might be needed for bidirectional mapping?
}

这是我开始的映射:

public class SummaryMap : ClassMap<Summary>
{
public SummaryMap()
{
Id(x => x.ID);

HasMany<Detail>(x => x.Details);
}
}

public class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Id(x => x.ID);

Map(x => x.ItemName).CanNotBeNull();
}
}

在详细信息表中,Summary_id 应该为 Not Null,因为在我的在这种情况下,没有附加到 Detail 对象是没有意义的摘要对象。但是,仅使用 HasMany() 映射会使 Summary_id 外键可为空。

我在 NHibernate 文档 ( http://www.hibernate.org/hib_docs/nhibernate/html/collections.html ) 中发现“如果需要父级,请使用双向一对多关联”。

那么如何在 Fluent NHibernate 中创建双向一对多映射?

最佳答案

要获得与详细信息表中非空外键列的双向关联,您可以添加建议的 Owner 属性、DetailsMap 类中的 References(...).CanNotBeNull() 映射,并使摘要结束逆。

为了避免两个关联方向有两个不同的外键列,您可以手动指定列名称,或者以为两个方向提供相同列名称的方式命名属性。在这种情况下,我建议您将Details.Owner 属性重命名为Details.Summary。

我通过增量生成摘要 id,以避免插入表时出现问题,因为当前摘要除了 id 之外没有列。

域名:

public class Detail
{
public int id { get; protected set; }
public string ItemName { get; set; }

// Renamed to use same column name as specified in the mapping of Summary.Details
public Summary Summary {get; set;}
}

public class Summary
{
public Summary()
{
Details = new List<Detail>();
}

public int id { get; protected set; }
public IList<Detail> Details { get; protected set; }
}

映射:

public class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Id(x => x.id)
.GeneratedBy.Native();

Map(x => x.ItemName)
.CanNotBeNull();

References<Summary>(x => x.Summary)
// If you don't want to rename the property in Summary,
// you can do this instead:
// .TheColumnNameIs("Summary_id")
.CanNotBeNull();
}
}

public class SummaryMap : ClassMap<Summary>
{
public SummaryMap()
{
Id(x => x.id)
.GeneratedBy.Increment();

HasMany<Detail>(x => x.Details)
.IsInverse()
.AsBag(); // Use bag instead of list to avoid index updating issues
}
}

关于nhibernate - 流畅的 NHibernate : How to create one-to-many bidirectional mapping?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/310641/

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