コンベンションの要件を満たさないデータベースで流暢な API を使用して 1 対 1 の関係を構成することは可能ですか? 以下に、データベースと生成されたモデルのサンプルを示します。テーブルは、主キー以外の制約とインデックスを定義しないことに注意してください。
テーブル:
create table Person (
PersonKey int primary key
)
create table Address (
AddressKey int primary key,
owner int not null // normally should be foreign key to Person
)
db から生成された最初のモデルをコード化します。
public partial class Person
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int PersonKey { get; set; }
}
public partial class Address
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AddressKey { get; set; }
public int Owner { get; set; }
}
Address から Person に移動できるようにするために、ナビゲーション プロパティが Address クラスに追加されました。
public partial class Address
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AddressKey { get; set; }
public int Owner { get; set; }
public virtual Person Person { get; set; }
}
プログラムがこのクエリを実行しようとすると:
var Addresss = context.Addresss.Include(x => x.Person).ToList();
ランタイムで例外が発生します:「列名 'Person_PersonKey' が無効です」。コンテキストはカスタム マッピングを構成しないため、規則に従って外部キーを見つけようとしますが、Owner プロパティは規則の要件を満たしていないため、例外になります。したがって、マッピングを追加する必要があります。Person と Address の関係が 1 対多になる場合は、次のような構成を追加できます。
modelBuilder.Entity<Address>()
.HasOptional(x => x.Person)
.WithMany()
.HasForeignKey(x => x.Owner);
上記で定義されたクエリは正しく実行されます。しかし、Person クラスに Address へのナビゲーション プロパティがあり、双方向の 1 対 1 の関係があるとしたらどうでしょう。
public partial class Person
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int PersonKey { get; set; }
public virtual Address Address { get; set; }
}
したがって、上記の構成は機能しません。私の質問は、データベース名とプロパティ名を変更せずに構成することは可能ですか?そうであれば、流暢な API のみを使用してどの構成を適用する必要がありますか?