Konwersja klasy bazowej EF CodeFirst na klasę dziedziczoną (przy użyciu tabeli na typ)

Korzystam z EF Code First i mam dwie klasy zdefiniowane w następujący sposób:

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<Building>();
    }
    public virtual IList<Building> Favourites { get; set; }
}

Wykorzystuje dziedziczenie tabeli na typ i definiuje schemat DB w następujący sposób:

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

Dokładnie tak chciałem, aby to zorganizowało.Teraz moje pytanie jest, jeśli utworzę obiekt użytkownika i zapiszę go w bazie danych, w jaki sposób będę mógł później rozszerzyć go na użytkownika (jeśli muszę?) Czy muszę usunąć użytkownika i utworzyć nowego użytkownika lub czy mogę jak rzucić użytkownika do obiektu gościa, a wpis w tabeli użytkownika pozostanie nienaruszony, a nowy wpis zostanie dodany do tabeli gości odnoszącej się do użytkownika? Coś podobnego do poniższego kodu?

Context.Set<User>().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<Visitor>().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<Visitor>().Where(v=>v.Id == 1).FirstOrDefault();
if (visitor==null)
{
    visitor = new Visitor(Context.Set<User>().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();

Myślę, że drugie podejście w powyższym kodzie może zadziałać, jeśli mogę go poprawnie dołączyć tylko do kontekstu. W każdym razie powyższy kod ma tylko pokazać, co próbuję osiągnąć. Wiem, że to nie zadziała. Czy ktoś może zaproponować bardziej eleganckie podejście?

Dziękuję Ci

questionAnswers(3)

yourAnswerToTheQuestion