1

Entity Framework 4.1 Code-First を使用して、あるクラスから別のクラスに 2 つのプロパティをバインドする必要があるシナリオがあります。(参考までに、このモデルは、Knockout.js 2.1 を使用する単一ページ アプリケーションで使用するために Upshot.js によって使用されています)

通常、私は次のようなことをしたでしょう:

    public class Person
    {
        [Key]
        public int PersonId { get; set; }

        public string FirstName { get; set; }
        public string LastName { get; set; }

        public Address HomeAddress { get; set; }
        public Address OfficeAddress { get; set; } 
    }

    public class Address
    {
        [Key]
        public int AddressId { get; set; }

        public string StreetAddress { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string ZipCode { get; set; }
    }

これにより、HomeAddress と OfficeAddress の両方が Address クラスのインスタンスを参照できるようになります。

これは私の実際のデータ モデルではないことに注意してください。これは説明のみを目的としています。実生活では、おそらく ICollection を使用していたでしょう。残念ながら、この特定の状況では実現不可能であり、あるクラスから別のクラスへの複数の参照を維持する必要があります。

この特定のシナリオでは、住所が定義されていない人が存在する可能性もあります。アドレスが個人なしで存在することも可能です。(前述のとおり、このデータ モデルは単なる例です。)

これは正しくコンパイルされ、データを作成して保存することもできますが、このモデルを使用しようとすると、upshot は激しく文句を言います。

次のような(内部)例外が発生します。

{"Unable to retrieve association information for association 'KnockoutTest.Models.Person_HomeAddress'. Only models that include foreign key information are supported. See Entity Framework documentation for details on creating models that include foreign key information."}

だから...私はDbContextクラスにForeign Key情報を設定しようとしました

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>()
    .HasOptional(m => m.HomeAddress);

    modelBuilder.Entity<Person>()
    .HasOptional(m => m.OfficeAddress);
}

喜びはありません!これでも同じ例外が発生しました。

あるクラスの複数のプロパティが別のクラスを参照できるように、外部キーの関連付けを設定する方法がわかりません。

私は何を間違っていますか、どうすれば修正できますか?

4

1 に答える 1

2

モデル クラスにスカラー外部キー プロパティを導入するだけです。

public class Person
{
    [Key]
    public int PersonId { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    [ForeignKey("HomeAddress")]
    public int? HomeAddressId { get; set; }
    public Address HomeAddress { get; set; }

    [ForeignKey("OfficeAddress")]
    public int? OfficeAddressId { get; set; } 
    public Address OfficeAddress { get; set; } 
}

int?関係はオプションであるため、プロパティは null 可能 ( ) である必要があります(人は住所なしで存在できます)。

于 2012-05-19T11:55:38.610 に答える