Entity Framework: связывание сущности A с существующей сущностью B - PullRequest
1 голос
/ 31 марта 2012

Я довольно новичок в Entity Framework, поэтому я, вероятно, пропускаю что-то простое здесь.

В моем классе контроллера я добавляю новый объект Category в базу данных, затем я использую этот объект в качествесобственность на объекте курса.Когда я сохраняю сущность курса, категория сохраняется снова в базе данных снова, и я надеялся, что новый курс будет ссылаться на уже вставленную категорию.

(упрощенный) код контроллера, который сохраняет первую категорию:

// Create and save the category
Category category = new Category {Name = "Test category"};
category = context.Categories.Add(category); 
context.SaveChanges(); //  The category object now has a CategoryId (the pk of the record)

// Create and save the course
Course course = new Course {
  FullDescription = "This is a new course",
  Name = "My new course",
  Category =  category // Hoping this will have EF make a link to the just inserted category
};

context.Courses.Add(course);
context.SaveChanges(); // Saves the Course AND creates a **new** Category in the db

Кажется, проблема в том, что я вызываю saveChanges () дважды.Что работает, так это удаление первого вызова context.saveChanges (), НО, это не мой настоящий код.В моем приложении я использую шаблон репозитория, а добавление категории осуществляется путем вызова categoryRepository.AddCategory (Category category).И сохранение курса выполняется точно таким же образом, вызывая courseRepo.AddCourse (курс курса), который также содержит вызов saveChanges ().

public Category AddCategory(Category category)
    {
        category = context.Categories.Add(category);
        context.SaveChanges();
        return category;
    }

Я не хочу удалять вызовыsaveChanges () в AddCourse () и AddCategory (), потому что я хочу, чтобы это были атомарные операции.

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

Ответы [ 2 ]

2 голосов
/ 31 марта 2012

Я не уверен, как структурирована ваша модель данных, но вы могли бы сделать что-то вроде этого.

course.CategoryId = category.CategoryId;

Таким образом вы отобразите фактический внешний ключ в отношениях, и он сделает то же самое.

0 голосов
/ 31 марта 2012
Category category = new Category {Name = "Test category"};
Course course = new Course {
FullDescription = "This is a new course",
  Name = "My new course",
  Category =  category 
};

courseRepo.AddCourse(course);

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

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