0

1対多の関係があり、子が削除されたり、外部キー列がNULLに設定されたりせずに、親エンティティを削除できる必要があるという問題があります。しかし、親を削除しようとするたびに、外部キー制約違反の例外が発生します。

NHibernate.Exceptions.GenericADOException: 更新クエリを実行できませんでした [SQL: [Customer] から削除] ---> System.Data.SqlClient.SqlException: DELETE ステートメントが REFERENCE 制約と競合しました "FK7867CB245055157F"

同様の1対1の関係があり、一方の端で外部キーをNULLに設定せずにエンティティを削除できる必要があり、NotFound.Ignore()を使用してこの問題を正常に解決しました. この解決策を正確に示唆するいくつかの回答を見つけましたが、まったく効果がないようです。ところで、マッピングを使用してデータベースを構築します。

ここに私のエンティティとマッピングがあります:

public class User : Entity
{
    ...
    public virtual Customer Customer { get; set; }
    ...
}
public class Customer : Entity
{
    ...
    public virtual string CustomerNumber { get; set; }
    public virtual User User { get; set; }
    public virtual IList<Vehicle> Vehicles { get; set; }
    ...
}
public class Vehicle : Entity
{
    ...
    public virtual string SerialNumber { get; set; }
    public virtual Customer Customer { get; set; }
    ...
}

AutoMapping とオーバーライドを使用しています:

public class UserMappingOverride : IAutoMappingOverride<User>
{
    public void Override(AutoMapping<User> mapping)
    {
        ...
        mapping.References(u => u.Customer).Column("CustomerNumber").NotFound.Ignore();
    }
}
public class CustomerMappingOverride : IAutoMappingOverride<Customer>
{
    public void Override(AutoMapping<Customer> mapping)
    {
        mapping.Id(u => u.Kundenummer).GeneratedBy.Assigned().Not.Nullable();
        mapping.HasOne(u => u.User).PropertyRef(c => c.Customer);
        mapping.HasMany(u => u.Vehicles).KeyColumns.Add("CustomerNumber")
            .Cascade.None()
            .Inverse();
    }
}
public class VehicleMappingOverride : IAutoMappingOverride<Vehicle>
{
    public void Override(AutoMapping<Vehicle> mapping)
    {
        mapping.Id(u => u.SerialNumber).GeneratedBy.Assigned().Not.Nullable();
        mapping.References(u => u.Customer).Column("CustomerNumber").NotFound.Ignore();
    }
}

前述のように、1 対 1 の関係では、User のマッピングで NotFound.Ignore() を使用します。これは約束どおりに実行されます。これにより、制約違反の例外を発生させずに Customer を削除し、「CustomerNumber」の値を保持することができます。 " User テーブルにそのまま。User エンティティと Customer エンティティ間の関係のマッピングは、データベースがマッピングから構築されるときに、データベースに外部キー制約を生成しません。

しかし、私の一対多の関係では同じことがうまくいきません。マッピングは私の 1 対 1 の関係とほぼ同じですが、ここで同様の質問で提案されているように NotFound.Ignore() を使用しますが、この関係は依然として外部キー制約を生成し、削除しようとすると制約違反の例外が発生します。顧客。唯一の回避策は、データベース内の FK を手動で削除するか、外部キー制約の強制を False に設定して変更することです。

データベースを構築するときに、NHibernate でこの外部キー制約を作成しないようにするか、Enfore 外部キー制約を False に設定するにはどうすればよいですか?

よろしく - ニコライ

ところで: エンティティと関係の全体的な設計に関するコメントには興味がありません。これらは、データ ソースからの制約に基づいてこのように設計されており、これが唯一のもっともらしい回避策です。:-) 同様の投稿で多くの回答が、目前の質問の次に設計評価者に焦点を当てていることがわかりました。

4

2 に答える 2

1

データベースで FK を回避することはできません。私の推測では、ユーザーから顧客への FK はありません。マッピングからスキーマを作成する場合は、FK の作成を無効にする必要があります。mapping.References(u => u.Customer).ForeignKey("none");

于 2012-10-18T09:33:27.427 に答える
0

フィーロの答えは、FK 制約を取り除く方法として正しい方向に私を指摘しました。ただし、Vehicle マッピングに追加.ForeignKey("none")してもうまくいきませんでした。しかし、同様のプロパティを Customer マッピングに追加すると、問題が解決しました。

したがって、解決策は次のようになりました。

mapping.HasMany(u => u.Vehicles).ForeignKeyConstraintName("none")
于 2012-10-20T11:08:47.957 に答える