Вставить данные в родительскую таблицу, а затем вставить родительский первичный ключ в дочернюю таблицу - PullRequest
0 голосов
/ 26 мая 2018

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

Мой вопрос: у меня есть родительская таблица User:

public partial class User

У этой таблицы есть свои атрибуты.

Тогда у меня есть дочерняя таблица Advertiser:

public partial class Advertiser : User

Я использую EF6.Теперь, пожалуйста, скажите мне, как сохранить данные в таблице User, а затем взять UserID и вставить их в таблицу Advertiser.

Проблема

Когда я делаю это

Advertiser.AdvertiserID = User.UserID;

db.SaveChanges();

Затем он говорит, предоставьте все значения Advertiser класса, которые возникли в результате наследования.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

В вашем примере отношения между рекламодателем и пользователем - это не родитель-ребенок, а наследование.EF поддерживает три модели наследования: таблица для типа, таблица для иерархии и таблица для конкретного экземпляра.Чтобы лучше понять, как они настроены и как будет выглядеть их схема, вы можете обратиться к ней (https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph), которая содержит ссылки для всех трех, или Google EF и TPT / TPH / TPC для альтернативных примеров. (DB-Первое)

Во всех случаях PK рекламодателя будет идентификатором пользователя. Принимая во внимание наследование или состав, вопрос заключается в том, является ли отношение "Есть" или "Имеет". Является ли рекламодатель пользователем,или у рекламодателя есть пользователь? Я бы предположил, что Is-A является точным отношением.

В отношении Is-A все сущности, которые являются "пользователями", будут иметь PK "UserId".есть базовая таблица пользователей или нет) В отношении Has-A, например, у рекламодателя есть адрес, вы бы рассматривали отношения типа «многие к 1» или «1 к 1», когда у рекламодателя есть AddressID, который указывает назапись адреса или таблица «многие-ко-многим» есть объединяющая таблица UserID и AddressID, чтобы связать их вместе.

Пока вы сохраняете эти отношения согласованными, EF confiГурация должна быть довольно простой.

0 голосов
/ 26 мая 2018

Если у User и Advertiser есть отношение в базе данных, у вас может быть Advertiser в User POCO для отношения один-к-одному.

public partial class User
{
   public User() {..}    
   ...
   public virtual Advertiser Advertiser { get; set; }
}

Если это так, вы можете просто позвонить SaveChanges один раз.Они становятся транзакцией.

user.Advertiser = new Advertiser 
{
    // No need to assign value to AdvertiserID
    FirstName = "John",
    LastName = "Doe"
}; 
db.Users.Add(user);
db.SaveChanges();

В противном случае они не имеют связи в базе данных.Вам придется сохранять один за другим.

db.Users.Add(user);
db.SaveChanges();

advertiser.AdvertiserID = user.UserID; // UserID is filled with newly created ID
db.Advertiser.Add(advertiser);
db.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...