1

コンベンションの要件を満たさないデータベースで流暢な 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 のみを使用してどの構成を適用する必要がありますか?

4

1 に答える 1

1

これが私の提案するコードです。あなたを正しく理解していることを願っています!

public partial class Person
{
    public int PersonKey { get; set; }

    public Address Address {get;set;}
}

public partial class Address
{
    public virtual Person Person { get; set; }

    public int PersonId { get; set; }

    public string AddressInfo {get;set;}
}

 modelBuilder.Entity<Person>() 
             .HasKey(a => a.PersonKey); 

 modelBuilder.Entity<Course>()
             .Property(c => c.CourseId)
             .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

 modelBuilder.Entity<Address>() 
             .HasKey(a => a.PersonId); 

 modelBuilder.Entity<Person>() 
             .HasRequired(p => p.Address) 
             .WithRequiredPrincipal(a => a.PersonId);
于 2015-04-13T13:21:16.057 に答える