私はEF5をコードファーストで流暢なマッピングアプローチで使用しています。これが私のシナリオです。わかりやすくするために切り詰めています。
public class SecuritySettings
{
public int Id { set; set }
public Company Company { get; set; }
public int MaximumInvalidPasswordAttempts { get; set;
// etc.
}
public class Company
{
public int Id { set; set }
public string Name { get; set; }
public SecuritySettings InternalUserSecuritySettings { get; set; }
public SecuritySettings ExternalUserSecuritySettings { get; set; }
}
上記だけで、Companyテーブルに2つのFKが表示されます。
InternalUserSecuritySettings_Id int, null
ExternalUserSecuritySettings_Id int, null
ここまでは順調ですね。
流暢なマッピングを設定するために使用した構成クラスがあります。1つはCompany用、もう1つはSecuritySettings用です。これらは必要なプロパティを規定しています。会社の構成内で、次のことを行うと、次のようになります。
HasRequired(x => x.InternalUserSecurityConfiguration);
これにより、次のようになります。
InternalUserSecuritySettings_Id int、nullではないExternalUserSecuritySettings_Id int、null
しかし、私がこれを追加すると:
HasRequired(x => x.ExternalUserSecurityConfiguration);
次の例外が発生します。
テーブル「Companies」にFOREIGNKEY制約「FK_dbo.Companies_dbo.SecuritySettings_ExternalUserSecurityConfiguration_Id」を導入すると、サイクルまたは複数のカスケードパスが発生する可能性があります。ON DELETENOACTIONまたはONUPDATENO ACTIONを指定するか、他のFOREIGNKEY制約を変更します。
私が試してみました:
- .WithRequiredDependent(y => y.Company).WillCascadeOnDelete(false)
- .WithRequiredDependent(y => y.Company).Map(m => m.MapKey( "ExternalUSC_Id"))
他のそのような順列の中で、例外が発生するか、FKの1つだけが作成されます。これは、エンティティ構成の流暢なマッピング(できれば会社のもの)内で行いたいと思います。明らかな何かが欠けていますか?null以外の非常に簡単で些細なことから、単純に規定するのが非常に難しいものに移行するのは非常に残念なことのようです。それぞれにキーが必要であり、両方ともnullであってはなりません。
実際の外部キーに別のプロパティを使用してこれを機能させる方法を見つけましたが、最初に、これはnull以外の要件に対して非常に余分な労力のようであり、次に、OnModelCreatingメソッドで多くの構成を宣言する必要がありました。 「WithMany()」マッピングは、私には直感に反します。