2015-05-24 3 views
4

Непонимайте, как сформулировать заголовок для этого, поэтому не стесняйтесь редактировать, если это неточно.Entity Framework 6 обновляет таблицу и вставляет в таблицы, связанные с внешним ключом

Используя пример, то, что я пытаюсь выполнить, это обновить запись в таблице foo, а затем создать новые записи в следующей таблице, в которой Foo-таблицы PK являются внешними ключами, считают отношения «один-ко-многим».

Как обновить таблицу с ограничениями внешнего ключа и создать новую связанную запись (записи) в этих последующих таблицах?

В настоящее время я использую Entity Framework 6 для .Add и .Attach сущностей в контексте и сохранять их в базе данных.

Редактировать

Чтобы дальше, что я пытаюсь добиться уточнения, ниже объект является урезанным составлен примером того, что я пытаюсь сохранить в контекст. Если я попытаюсь. Добавьте intObj после того, как «Билли Боб» уже создан, потому что он купил новый автомобиль, другой сервис или его шины изменили его, создаст новую запись Билли Боба (дубликат) и соответствующие связанные таблицы.

 intObj.FirstName = "Billy"; 
     intObj.Lastname = "Bob"; 
     intObj.Important = 100; 
     intObj.LastSeen = DateTime.Now.Date; 
     intObj.Cars = new List<Car>{ 
      new Car{ 
       Model = "Commodore", 
       Make = "Holden", 
       YearMade = DateTime.Today.Date, 
       Odometer = 15000, 
       EmailWordCount = 500, 
       TyreStatuss = new List<TyreStatus>{ 
        new TyreStatus{ 
         Tyre1 = "Good", 
         Tyre2 = "Good", 
         Tyre3 = "Okay", 
         Tyre4 = "Okay" 
         }         
       }, 
       Services = new List<Service>{ 
        new Service{ 
         Cost = "$500", 
         Time = "2 Days", 
         Date = DateTime.Today 
        } 
       }, 
      } 
     }; 

Благодаря

+0

Какой подход вы используете. Код сначала? Модель/База данных? –

+0

Я использую код first @ E-Bat – Corey

+0

Я разработал ответ соответственно –

ответ

3

В следующих фрагментах у вас есть класс Employee, который ссылается еще два объекта: совокупность уступки и одной страны.
ORM, такие как EF, NHibernate и т. Д., Имеют функцию, известную как Transitive Persistence, то есть если объект (Assignment and Country) ссылается на постоянный (Employee), то Assignments and Country в конечном итоге станут постоянными когда в вашем случае EF метод SaveChanges активируется в Контексте, без явного сохранения их.

public class Employee 
     { 
      public virtual Guid Id { get; protected set; } 
      public virtual string EmployeeNumber { get; set; } 
      public virtual Country BirthCountry { get; set; } 
      private ICollection<Assignment> _assignment = new List<Assignment>(); 
      public virtual ICollection<Assignment> Assignments 
      { 
       get 
       { 
        return _assignment; 
       } 

       set 
       { 
        _assignment= value; 
       } 
      } 
     } 

     public class Assignment 
     { 
      public virtual Guid Id { get; protected set; } 
      public virtual DateTime BeginTime { get; set; } 
      public virtual DateTime EndTime { get; set; } 
      public virtual string Description{ get; set; } 
     } 

     public class Country 
     { 
      public virtual Guid Id { get; protected set; } 
      public virtual string Name { get; set; } 
     } 

    //Somewhere in your program  
    private void SaveAllChanges() 
     { 
      _db = new EFContext(); 
      //Creating a new employee here, but it can be one loaded from db 
      var emp = new Employee { FirstName = "Emp Name", 
       LastName = "Emp Last", EmployeeNumber = "XO1500" 
      }; 
      emp.BirthCountry = new Country { Name = "Country1" }; 
      emp.Assignment.Add(new Assignment{ BeginTime = DateTime.Now,EndTime=DateTime.Now.AddHours(1) }); 

      //Only employee is explicitly added to the context 
      _db.Employees.Add(emp); 
      //All the objects in the employee graph will be saved (inserted in this case) in the db. 
      _db.SaveChanges(); 
     } 
    } 

EDIT:

Это очень похоже на мой код выше после того, как «Билли Боб» создается вам только нужно обновить его, и которые включают в себя любую новую услугу он купить;

псевдокоде:

var bob = _db.Clients.SingleOrDefault(c=> c.Id = "Bob Row Id") 
//Bob buy a car: 
bob.Cars.Add(new Car()...) 
//...and change tire 1 from an old car 
var car = bob.Cars.SingleOrDefault(c=> c.Id = "Car Row Id") 
car.TireStatus.Tire1 = "New" 
.... 

//Persist all changes 
//Existing objects will be updated..., and the new ones created in this process will be inserted 
_db.SaveChanges() 

Позвольте мне знать, если это уточнить ваши идеи

+0

Спасибо за ответ @ E-Bat. Это тот подход, который я попытался изначально. Я обновил свой вопрос, чтобы включить более подробную информацию, дайте мне знать, если мой запрос требует большего разъяснения. – Corey

+0

Удивительный помощник благодарности, который заполняет пробел, теперь он работает правильно! – Corey

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