Entity Framework сохранение данных в однозначных ассоциациях - PullRequest
8 голосов
/ 11 мая 2011

Я пытаюсь использовать подход сопоставление внешнего ключа для достижения однозначного сопоставления в EF.В моем случае существует связь между пользователем и командой, и мне нужно свойство навигации в каждом из них.Я столкнулся с проблемой при попытке сохранить данные.

Вот как выглядят модели:

public class Team
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int OwnerID { get; set; }
    public virtual User Owner { get; set; }
}

public class User
{
    public int ID { get; set; }
    public string UserName { get; set; }

    public int TeamID { get; set; }
    public virtual Team Team { get; set; }
}

Я добавил эти биты в DbContext OnModelCreating(), как указано всообщение в блоге, на которое ссылаются выше:

modelBuilder.Entity<User>()
    .HasRequired(u => u.Team)
    .WithMany()
    .HasForeignKey(u => u.TeamID);

modelBuilder.Entity<Team>()
    .HasRequired(t => t.Owner)
    .WithMany()
    .HasForeignKey(t => t.OwnerID)
    .WillCascadeOnDelete(false);

А теперь при добавлении данных вот так:

User u = new User();
u.UserName = "farinha";
Team t = new Team("Flour Power");
u.Team = t;
t.Owner = u;
context.Users.Add(u);
context.Teams.Add(t);
context.SaveChanges();

или даже так:

User u = new User();
u.UserName = "farinha";
u.Team = new Team("Flour Power");
context.Users.Add(u);
context.SaveChanges();

Я получаюследующая ошибка:

Невозможно определить действительный порядок для зависимых операций.Зависимости могут существовать из-за ограничений внешнего ключа, требований модели или сгенерированных в магазине значений.

Есть идеи, как решить эту проблему?Я неправильно сохраняю данные?

Заранее спасибо

1 Ответ

9 голосов
/ 11 мая 2011

Вы не сохраняете данные неправильно, но они просто не могут работать, потому что вы определили двунаправленную зависимость. Команда может быть сохранена, только если она связана с уже сохраненным пользователем, а пользователь может быть сохранен, только если он связан с существующей командой. Вы должны сделать одно отношение необязательным, пометив свойство внешнего ключа как nullable (например, TeamId in User):

public class User
{
    public int ID { get; set; }
    public string UserName { get; set; }

    public int? TeamID { get; set; }
    public virtual Team Team { get; set; }
}

Затем вы должны сначала сохранить объект User, а затем вы можете сохранить Team.

User u = new User();
u.UserName = "farinha";
context.Users.Add(u);
context.SaveChanges();

u.Team = new Team { Name = "Flour Power", OwnerID = u.ID };
context.SaveChanges();
...