我有许多对一的对象之间的关系 ProductSupplier.我需要能够删除 Supplier 没有删除 Products属于它。

这是一个简化版本的课程:

public class Supplier {
    public virtual IList<Product> Products { get; protected set; }
}

public class Product {
    // Product belongs to a Category but Supplier is optional
    public virtual Supplier Supplier { get; set; }
    public virtual Category Category { get; set; }
}

我使用的FluentNHibernate,但这里的映射它的生产:

<bag name="Products" cascade="save-update" inverse="true">
      <key column="SupplierID" />
      <one-to-many class="Me.Product, Me, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>

<many-to-one name="Supplier" column="SupplierID" />

这将创建一个外国的关键产品的表格,所以当我试图做的一直上的删除的供应商,我获得一个外国的关键制约因素的错误。我试图改变级联到"所有",希望它可能只删除的关系,但它删除了所有的产品和他们的其他相关对象。

只有这样我可以看到解决这一权利是循环的产品集合的供应商和设置的供应商的财产为空。是有一个办法可以实现这种行为通过的映射?

有帮助吗?

解决方案

的映射性才会生效,当该实体实际上是装载,而当你不查询的通过非常.作为一个例子,如果你指定的 Cascade=ALL, 如果你删除的供应商的查询 "delete from Supplier where id=:id", 你可能会得到相同的FK约束失败,因为非常不触发(方案)瀑布。

它似乎是产品的拥有侧的关系,这是好的。我认为你有两个选择:

  • 代码一些方法上的供应商迭代通过的所有产品和设置的产品的供应商向空,并使用这个方法之前,删除任何供应商
  • 在发出一个供应删除,请确保您的道设置的产品的供应为空

例如:

public int Delete(Supplier s) {
    return Session.CreateQuery("udpate Product set Supplier = null where Supplier = :supplier")
        .SetParameter("supplier", s)
        .ExecuteUpdate();
}

其他提示

请勿这样做。

您的模型中有一个隐含或显式断言,所有产品都有供应商。外键是为了强制执行这种情况。在保留产品的同时删除供应商会违反您的模型,并可能导致您的大部分代码(依赖于此始终如此)失败。

您可以做的一件事是,您已经发现:对于拥有此供应商的每个产品,您都可以将产品供应商设置为空。这不会违反您的条件,但与“我们不知道该产品的供应商是谁”相同。并可能导致代码失败。

你为什么要这样做?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top