【问题标题】:Ruling out NHiberate mappings causing deletion of entity排除导致实体删除的 NIBerate 映射
【发布时间】:2013-08-29 00:13:28
【问题描述】:

我有一个 NHibernate 问题,我更新了一个实体并导致另一个实体的删除。实体集和相关映射太大,无法在此处复制,但我想创建一些示例数据来讨论这个问题。在这个剪切示例中,假设更新 D 会导致删除 A

问: 鉴于所有与 相关的映射文件,这是否是一个映射问题不可能 >A 即(BMappingFile 和 CMappingFile)将其映射到 A 设置为 .Cascade.None() 或者有一些我应该知道的其他 NHib 配置/映射相关设置可以实现这种行为?

数据库表

一个

援助|姓名

B

投标 | Bname | 援助

C

Cid | Cname | Aid

D

| Dname | Cid

以及一组对应的映射文件

映射文件

public AMap()
{
    Table("[dbo].[A]");
    LazyLoad();
    Cache.ReadWrite().IncludeAll();

    Id(x=>x.Aid)
    .Access.CamelCaseField(Prefix.Underscore)
    .Column("[Aid]")
    .GeneratedBy.Identity();

HasMany(x=>x.Bs)
    .Access.CamelCaseField(Prefix.Underscore)
    .Cascade.AllDeleteOrphan()
    .Fetch.Select()
    .Inverse()
    .LazyLoad()
    .KeyColumns.Add("[Aid]")
    .Cache.ReadWrite().IncludeAll();

HasMany(x=>x.Cs)
    .Access.CamelCaseField(Prefix.Underscore)
    .Cascade.AllDeleteOrphan()
    .Fetch.Select()
    .Inverse()
    .LazyLoad()
    .KeyColumns.Add("[Aid]")
    .Cache.ReadWrite().IncludeAll();

    ...
}

BMappingFile

public BMap()
{
    Table("[dbo].[B]");
    LazyLoad();
    Cache.ReadWrite().IncludeAll();

    Id(x=>x.Bid)
    .Access.CamelCaseField(Prefix.Underscore)
    .Column("[Bid]")
    .GeneratedBy.Identity();

    References(x=>x.A)
    .Access.CamelCaseField(Prefix.Underscore)
    .Cascade.None()
    .Fetch.Select()
    .Columns("[Aid]");

    ...
}

CMappingFile

public CMap()
{
    Table("[dbo].[C]");
    LazyLoad();
    Cache.ReadWrite().IncludeAll();

    Id(x=>x.Cid)
    .Access.CamelCaseField(Prefix.Underscore)
    .Column("[Cid]")
    .GeneratedBy.Identity();

    References(x=>x.A)
    .Access.CamelCaseField(Prefix.Underscore)
    .Cascade.None()
    .Fetch.Select()
    .Columns("[Aid]");

HasMany(x=>x.Ds)
    .Access.CamelCaseField(Prefix.Underscore)
    .Cascade.AllDeleteOrphan()
    .Fetch.Select()
    .Inverse()
    .LazyLoad()
    .KeyColumns.Add("[Did]")
    .Cache.ReadWrite().IncludeAll();

    ...
}

DMappingFile

public DMap()
{
    Table("[dbo].[D]");
    LazyLoad();
    Cache.ReadWrite().IncludeAll();

    Id(x=>x.Did)
    .Access.CamelCaseField(Prefix.Underscore)
    .Column("[Did]")
    .GeneratedBy.Identity();

    References(x=>x.C)
    .Access.CamelCaseField(Prefix.Underscore)
    .Cascade.None()
    .Fetch.Select()
    .Columns("[Cid]");

    ...
}

【问题讨论】:

  • 你用什么代码来修改和保存这些对象?
  • 它可以是对对象图中任何实体的任何类更新。没有发生删除。我更感兴趣的是确认到 A 的直接映射文件是否都是 Cascade.None() ,我可以排除这些映射,并希望获得关于还有什么可能起作用的建议。

标签: nhibernate fluent-nhibernate mapping


【解决方案1】:

您应该提供您的代码或查询的 sn-p,但回到您的问题。

我有一个 NHibernate 问题,我更新了一个实体并导致另一个实体的删除

假设您持久化了 A-entity 实例,其集合为 5 B。一旦您使用Bs 的空集合更新A 的实例,所有Bs 都将被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多