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

Brock,你不能有多个相同类型的一对一关联。

EF 不支持这种情况,原因是在一对一关系中,EF 要求依赖项的主键也是外键。另外,EF 没有办法在 Child 实体中“知道”关联的另一端(即 Child 实体中 Parent 导航的 InverseProperty 是什么?- ChildOne 还是 ChildTwo?)

在一对一关联中,您还必须定义主体/依赖:

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

您可能需要查看http://msdn.microsoft.com/en-US/data/jj591620以了解有关配置关系的详细信息。

而不是 2 个一对一的关系,您可能希望有一个一对多的关联,并在代码中处理它,因此它只有 2 个子元素。您可能还需要 Child 实体中的附加属性来确定孩子是“ChildOne”还是“ChildTwo”。

于 2013-08-19T23:19:16.487 回答