Использование ASP.Net и Entity Framework: добавление дочернего объекта в отношении 1: 1 - PullRequest
1 голос
/ 13 января 2012

Это может быть лень с моей стороны, но я не мог найти простой пример этого.

Ссылаясь на мое любимое телешоу «Игра престолов», мой пример выглядит следующим образом:

Table Throne (ThroneID)
Table King (ThroneID)

Используя Entity Framework 4, у меня есть две таблицы, которые имеют отношение 1: 1 друг к другу. В коде я хочу связать короля с троном. Трон может иметь 0 или 1 короля. Если это было 1: Многие, у меня был метод Add() для создания ассоциации. Что я использую для 1: 1?

(хорошо, теперь я понимаю, что мой пример не самый лучший ... но в этом примере KingID будет таким же, как ThroneID для обеспечения 1: 1)

GameOfThronesContext context = new GameOfThronesContext();
Throne t = new Throne();
King k = new King();
t.Kings.Add(k);  // doesn't work because "Add" isn't available
context.Thrones.AddObject(t);

Ответы [ 3 ]

4 голосов
/ 13 января 2012

нижеприведенное решение, если для EF Code First 4.1 показано, как спроектировать два класса, чтобы иметь отношение между единицами к нулю / единице, результат будет:

  • Трон{Id (PK), Имя ..}
  • Король {Id (PK, FK), Имя ..}

</p>

<p>public class Throne
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual King King { get; set; }
    }</p>

<pre><code>public class King
{
    public int Id { get; set; }
    public virtual Throne Throne { get; set; }
    public string Name { get; set; }
}

Затем отношение определяется в OnModelCreating контекста или в классе конфигурации:

<code>
public class MyContext : DbContext
{
    public DbSet< Throne> Thrones { get; set; }
    public DbSet< King> Kings { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {<br>
        //We define the key for the King table
        modelBuilder.Entity< King>().HasRequired(x => x.Throne);
    }
}</p>

<p>
Затем вы можете:
<code>
 var throne = new Throne(){Name = "First Throne"};
 var king = new King() { Name = "First King" };
 throne.King = king;
 context.Thrones.Add(throne);
 context.SaveChanges();
0 голосов
/ 23 января 2012

Итак, я ответил на свой вопрос: М.С. организует его так, что в этом случае вы должны назначить родителя ребенку.Сгенерированный код из Data Entity Framework по какой-то причине не дает возможности назначить дочерний элемент родительскому.Мне понадобилось время, чтобы найти его.Следующие работы:

GameOfThronesContext context = new GameOfThronesContext();
Throne t = new Throne();
King k = new King();
//t.Kings.Add(k);  // doesn't work because "Add" isn't available
k.Throne = t;  // this is made available by the framework
context.Thrones.AddObject(t);

При этом george2giga показывает, как улучшить модель, чтобы вы могли добавить дочернего элемента к родителю (я думаю), чтобы вы могли использовать t.King = k; так, как яхотел в первую очередь, что является лучшим решением.Престижность.

0 голосов
/ 13 января 2012

Обновлено, чтобы отразить комментарии ОП:

var t = new Throne {
    Id = Guid.NewGuid(),
    //...
    King = new King {
        Id = Guid.NewGuid()
        //...
    }
};

context.Thrones.Add(t);
context.SaveChanges();

EF 4.1 достаточно умен, чтобы справиться с ограничениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...