1 から 0..1 へのマッピングを Entity Framework Code First で機能させようとしていますが、エラーが発生し続けます: ReferentialConstraint の依存プロパティがストア生成列にマップされています。列:「ID」。
必須の Location を持つ MainLocation がありますが、Location には複数の子 Location を含めることができるため、Location オブジェクトに MainLocation は必要ありません。
MainLocation は MainLocationAddress と同様の関係にありますが、これは 1 対 1 の関係であり、同じデータベース テーブルを構成します。
ER モデルは次のようになります。
私のエンティティは次のようになります。
[Table("MainLocation")]
public class MainLocation : IEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public virtual MainLocationAddress Address { get; set; }
[Required]
public virtual Location Location { get; set; }
}
[Table("MainLocation")]
public class MainLocationAddress : BaseAddress
{
[Key, ForeignKey("MainLocation")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public virtual MainLocation MainLocation { get; set; }
}
public class Location : IEntity
{
public int Id { get; set; }
public virtual Location ParentLocation { get; set; }
public virtual ICollection<Location> ChildLocations { get; set; }
protected virtual MainLocation MainLocation { get; set; }
internal MainLocation GetMainLocation() { return this.MainLocation; }
internal void SetMainLocation(MainLocation mainLocation) { MainLocation = mainLocation; }
}
DbContext クラスの OnModelCreating で関連付けを構成しました。
modelBuilder.Entity<MainLocation>()
.HasRequired(x => x.Location)
.WithOptional();
modelBuilder.Entity<MainLocation>()
.HasRequired(x => x.Address)
.WithRequiredPrincipal();
PS!Location の MainLocation プロパティは、直接アクセスできないため保護されています。代わりに、Location から値を取得するか、ParentLocation から継承された値を取得するサービス層があります。取得しているエラーに関して変更が加えられたかどうかを確認するために、公開に変更しようとしました。
.WithOptional() を .WithOptional(x => x.MainLocation) に拡張することはできましたが、記載されているエラーに変更はありませんでした。