Отношение «один к нулю или один» через свободный API

Я хочу определить следующую модель с помощью свободного API.

введите здесь описание изображения

Вот я и написал эту модель

public class Entity1
{
  public int Id { get; set; }
  public virtual Entity2 Entity2 { get; set; }
}

public class Entity2
{
  public int Id { get; set; }
  public virtual Entity1 Entity1 { get; set; }
}

И это отображение

public class Entity1Map : EntityTypeConfiguration<Entity1>
{
    public Entity1Map()
    {
        // Primary Key
        this.HasKey(t => t.Id);

        // Properties
        // Table & Column Mappings
        this.ToTable("Entity1");
        this.Property(t => t.Id).HasColumnName("Id");
    }
}

public class Entity2Map : EntityTypeConfiguration<Entity2>
{
    public Entity2Map()
    {
        // Primary Key
        this.HasKey(t => t.Id);

        // Properties
        // Table & Column Mappings
        this.ToTable("Entity2");
        this.Property(t => t.Id).HasColumnName("Id");

        // Relationships          
        this.HasRequired(t => t.Entity1)
            .WithOptional(t => t.Entity2);
    }
}

Довольно прямолинейно. Затем я генерирую миграции с помощью команды Add-Migration.

Вот тут я запутался. Потому что сгенерированные таблицы выглядят не так, как я ожидал.

CreateTable(
    "dbo.Entity1",
    c => new
        {
            Id = c.Int(nullable: false, identity: true),
        })
    .PrimaryKey(t => t.Id);

CreateTable(
    "dbo.Entity2",
    c => new
        {
            Id = c.Int(nullable: false),
        })
    .PrimaryKey(t => t.Id)
    .ForeignKey("dbo.Entity1", t => t.Id)
    .Index(t => t.Id);

Во-первых, я бы ожидал, что внешний ключ с нулевым значением в Entity1. Но этот .ForeignKey("dbo.Entity1", t => t.Id) не имеет для меня большого смысла, он определяет внешний ключ для Entity1 с Id из своей собственной таблицы. Это ли не ссылка на самого себя?

Другая проблема заключается в том, что я не могу поставить .HasForeignKey() в отношение. На случай, если я захочу, чтобы внешний ключ был представлен в модели, как это делается с отношениями «один ко многим».


person Snæbjørn    schedule 13.02.2014    source источник
comment
Можете ли вы перепроверить код, который вы разместили? Должен ли Entity2 также сопоставляться с таблицей Entity1?   -  person Anthony Chu    schedule 13.02.2014
comment
может быть это то, что вы ищете для?   -  person Zafar    schedule 14.02.2014
comment
Я думаю, проблема в том, что я неправильно понял, где EF помещает внешние ключи в отношении 1: 0.. 1. Идентификатор таблицы 0..1 (entity2) является первичным, а также внешним ключом, вместо того, чтобы помещать его в другую таблицу (entity1). Оба подхода имеют плюсы и минусы. Однако он помещает двойной индекс в этот ключ идентификатора, который я считаю ошибкой. Потому что первичный ключ уже является индексом, поэтому нет необходимости его снова индексировать.   -  person Snæbjørn    schedule 14.02.2014