0

私は何か間違ったことをしていると確信していますが、それを理解することはできません。問題を再現するために Breezejs Todo + Knockout の例を使用しています。次のデータモデルがあります。

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Todo.Models
{
  public class Parent
  {
    public Parent()
    {
    }
    [Key]
    public int Id { get; set; }

    [Required]
    public string OtherProperty { get; set; }

    public Child ChildOne { get; set; }

    public Child ChildTwo { get; set; }

  }
  public class Child
  {
    [Key]
    public int Id { get; set; }

    public int ParentId { get; set; }

    [ForeignKey("ParentId")]
    public Parent Parent { get; set; }
  }
}

アプリでは、次のことを行います。

breeze.NamingConvention.camelCase.setAsDefault();
var manager = new breeze.EntityManager(serviceName);
manager.fetchMetadata().then(function () {
  var parentType = manager.metadataStore.getEntityType('Parent');
  ko.utils.arrayForEach(parentType.getPropertyNames(), function (property) {
    console.log('Parent property ' + property);
  });
  var parent = manager.createEntity('Parent');
  console.log('childOne ' + parent.childOne);
  console.log('childTwo ' + parent.childTwo);
});

問題は、childOne と childTwo が Parent のプロパティとして定義されていないことです。私のデータモデルに何か問題がありますか? ログ メッセージは次のとおりです。

Parent property id
Parent property otherProperty
childOne undefined
childTwo undefined
4

1 に答える 1

0

ブロックさん、同じタイプの 1 対 1 の関連付けを複数持つことはできません。

EF はこのようなシナリオをサポートしていません。その理由は、1 対 1 の関係では、依存関係の主キーが外部キーでもある必要があるためです。さらに、EF が Child エンティティのアソシエーションのもう一方の端を「認識する」方法はありません (つまり、Child エンティティの Parent ナビゲーションの InverseProperty は何ですか? - ChildOne または ChildTwo?)。

1 対 1 の関連付けでは、プリンシパル/従属も定義する必要があります。

  modelBuilder.Entity<Parent>()
      .HasRequired(t => t.ChildOne)
      .WithRequiredPrincipal(t => t.Parent);

関係の構成の詳細については、http://msdn.microsoft.com/en-US/data/jj591620を確認してください。

2 つの 1 対 1 の関係の代わりに、1 対多の関連付けを作成し、それをコードで処理して、子要素が 2 つだけになるようにすることもできます。子が "ChildOne" または "ChildTwo" であるかどうかを判断するために、Child エンティティに追加のプロパティが必要になる場合もあります。

于 2013-08-19T23:19:16.487 に答える