2016-11-04 8 views
0

Я получил проект, в котором сначала используется код EF6. У меня есть 2 класса, в которых установлены отношения друг к другу, то же самое устанавливается в Fluent API.Entity framework 6 код сначала один к одному, а не один к одному

Когда я создаю родительский/дочерний объект на одном и том же шаге, все в порядке и сохраняется, но когда я сначала создаю родителя, сохраните его, а затем я хочу добавить ребенка, я получил исключение, которое гласит, что эти два объекта в соотношении 1 к 0..1, и он не сохраняется.

Есть ли способ создать только родительский элемент, а затем добавить к нему ребенка?

Модель класса:

public class Parent 
{ 
    public int ParentId {get; set;} 
    public virtual ICollection<Child> Children {get; set;} 
} 

public class Child 
{ 
    public int ChildId {get; set;} 
    public virtual Parent Parent {get; set;} 
} 

Fluent API:

modelBuilder.Entity<Child>() 
        .HasRequired<Parent>(s => s.Parent) 
        .WithMany(s => s.Children) 
        .HasForeignKey(s => s.ParentId); 

В базе данных я вижу внешнего ключа ParentId. Родитель может существовать без ребенка, если я прав. Все сохраняется с dbContext.SaveChanges()

Исключение:

Exception thrown: 'System.Exception' in Project.dll 

Additional information: Multiplicity constraint violated. The role 'Child_Parent_Target' of the relationship 'Project.DAL.Child_Parent' has multiplicity 1 or 0..1. 
+0

Таким образом, вы хотите, чтобы изменить отношение от одного до многих один к одному? – user449689

+0

Я тоже об этом думал, но сначала я хотел бы знать, есть ли способ заставить его работать в текущих отношениях, также у меня нет подсказки, откуда находится EF с отношением «1 к 0..1» , Я хотел узнать, откуда эта проблема, поэтому я могу взглянуть на нее и посмотреть, можно ли ее исправлять или требуется изменение отношений. – Mony

+0

Пожалуйста, обновите вопрос, отправляя точное исключение, которое вы получаете – user449689

ответ

0

Рассмотрим дать вашему ребенку ParentId недвижимости

public class Child 
{ 
    public int ChildId {get; set;} 

    public int ParentId {get; set;} 
    public virtual Parent Parent {get; set;} 
} 

Если вы сделаете это, вы будете следовать code-first conventions (click to view). Если вы следуете соглашениям, Entity Framework понимает, что Parent-Child является отношением один-ко-многим: родитель имеет ноль или более дочерних элементов, а у ребенка есть ровно один родитель.

Приятно отметить следующие соглашения: вам не нужны ваши текущие заявления API. Entity Framework знает, что требуется родительский элемент, что родительский элемент имеет много дочерних элементов, а внешний ключ для родителя - ParentId

Назад к проблеме. После добавления ParentId к вашему ребенку вы можете добавить родителя без детей и позже добавить детей.

После добавления ParentID вы можете добавить родитель и добавить ребенок позже

public class Parent 
{ 
    public int ParentId {get; set;} 
    public string Name {get; set;} 

    public virtual ICollection<Child> Children {get; set;} 
} 

public class Child 
{ 
    public int ChildId {get; set;} 
    public string Name {get; set;} 

    // By convention will become the foreign key to Parent: 
    public int ParentId {get; set;} 
    public virtual Parent Parent {get; set;} 
} 

public class MyDbContext : DbContext 
{ 
    public DbSet<Parent> Parents {get; set;} 
    public DbSet<Child> Children {get; set;} 
} 

public void Main() 
{ 
    using (var dbContext = new MyDbContext(...)) 
    { 
     var addedParent = dbContext.Parents.Add(new Parent() 
     { 
      Name = "Phil Dunphy", 
     } 

     // if you do not want to add a child now, you can SaveChanges 
     dbContext.SaveChanges(); 

     // now addedParent has a ParentId, you can add a child: 
     var addedChild = dbContext.Children.Add(new Child() 
     { 
      Name = "Luke Dunphy", 
      ParentId = addedParent.Id, 
     }; 
     dbContext.SaveChanges(); 
    } 
} 
+0

, когда я меняю класс модели таким образом, а затем попытаюсь добавить детей к уже существующему родителю. exception 'Оператор INSERT противоречил ограничениям FOREIGN KEY" FK_dbo.Children_dbo.Parents_ParentId ". Конфликт произошел в базе данных «CLDash0001», таблице «dbo.Parents», в столбце «ParentId». – Mony

+0

Помимо ошибок ввода, программа работает в моем решении. Может быть, у вас проблемы, потому что вы делаете это в уже существующей базе данных, и вы изменили свою модель базы данных? Попробуйте этот код в пустом проекте только с родительским/дочерним/MyDbContext. В конструкторе DbContext передается имя несуществующей базы данных, поэтому оно будет создано для вас. –

+0

Не думаю, что у меня также есть классы моделей с тем же кодом, что и вы, так что это не проблема с БД, я думаю, что проблема где-то в сохранении, в коде, который отвечает за правильное добавление ключей и так далее. Код довольно сложный, и после добавления записей не возникает 'SaveChanges()' вызов, все сохраняется сразу, это мастер с несколькими шагами и 'SaveChanges()' вызывается из родительского контроллера, где находятся методы, которые обновляют значения дети, потому что до этого момента все записи хранятся в 'TempData []' – Mony

 Смежные вопросы

  • Нет связанных вопросов^_^