Преобразование базового класса EF CodeFirst в класс Inherited (с использованием таблицы для каждого типа)

Я использую EF Code First и два класса определены следующим образом:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
}

[Table("Visitors")]
public class Visitor : User
{
    public Visitor()
    {
        Favourites = new List();
    }
    public virtual IList Favourites { get; set; }
}

При этом используется наследование таблиц по типам и определяется схема БД следующим образом:

Users Table
    Id int PK
    Username nvarchar(max)
    Email nvarchar(max)
Visitors Table
    Id int PK (FK to Users table)

Именно так я и хотел это структурировать.Теперь мой вопрос, если я создаю объект User и сохраняю его в БД, как позже я смогу расширить его до посетителя (если мне нужно?). Мне нужно будет удалить пользователя и создать нового посетителя, или можно как преобразовать пользователя в объект посетителя, и запись в таблице пользователя останется нетронутой, и в таблицу посетителя будет добавлена новая запись, ссылающаяся на пользователя? Что-то вроде приведенного ниже кода?

Context.Set().Add(new User(){Id=1, Username="Bob", Email="[email protected]"});
Context.SaveChanges();

//and elsewhere in the project I want to do this sort of thing:
Context.Set().Where(v=>v.Id == 1).FirstOrDefault().Favourites.Add(someFavouriteBuilding); //This obviously doesn't work, because the FirstOrDefault call returns null, so it will throw an exception
Context.SaveChanges();

//or maybe this can be modified slightly to work?:
var visitor = Context.Set().Where(v=>v.Id == 1).FirstOrDefault();
if (visitor==null)
{
    visitor = new Visitor(Context.Set().Where(u=>u.Id == 1).FirstOrDefault()); // this contructor copies all the property values accross and returns a new object
}
visitor.Favourites.Add(someFavouriteBuilding); //This obviously doesn't work either
var entry = Context.Entry(visitor);
entry.State = EntityState.Modified;//here it throws this error: An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
Context.SaveChanges();

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

Спасибо

Ответы на вопрос(3)

Ваш ответ на вопрос