Database EF代码优先,多态性强制转换

Database EF代码优先,多态性强制转换,database,polymorphism,ef-code-first,Database,Polymorphism,Ef Code First,我有一个人和一个注册人的项目 public class Person : BaseClass { public string Email { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public virtual ICollection<Team> ParentTeams { ge

我有一个人和一个注册人的项目

public class Person : BaseClass
    {
        public string Email { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public virtual ICollection<Team> ParentTeams { get; set; }
        public virtual ICollection<Team> ChildTeams { get; set; }

        [NotMapped]
        public bool IsChildPerson { get; set; }
    }

public class RegisteredPerson : Person
    {
        public int ProxyId { get; set; }
    }
注册人继承人

在某一点上,该人成为注册人。但是这个人已经准备好要加入一个团队了


我怎样才能在不丢失到其他数据库的链接的情况下将此人转换为注册人?

据我所知,您不能向下转换。您可以使用映射库将Person对象映射到RegisteredPerson,然后使用上下文进行保存

例如:

using AutoMapper;

//Create Map from Person to RegisteredPerson
Mapper.CreateMap<Person, RegisteredPerson>();

//Load person from Database
Person p = context.Persons.SingleOrDefault(predicate);
//Map Person to RegisteredPerson
RegisteredPerson r = Mapper.Map<Person, RegisteredPerson>(p);
//Assign values to RegisteredPerson
r.ProxyId = SomeValue;
using (var context = new YourContext())
{
    context.Persons.Attach(r);
    context.SaveChanges();
}
//Load new RegisteredPerson
using (var context = new YourContext())
{
    RegisteredPerson rp = context.Persons.OfType<RegisteredPerson>().SingleOrDefault(predicate);
}

希望这有帮助……

你的问题在于这句话:

在某一点上,该人成为注册人

public class Person : BaseClass
    {
        public string Email { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public virtual ICollection<Team> ParentTeams { get; set; }
        public virtual ICollection<Team> ChildTeams { get; set; }

        [NotMapped]
        public bool IsChildPerson { get; set; }
    }

public class RegisteredPerson : Person
    {
        public int ProxyId { get; set; }
    }
在静态OOP中,类的实例不能成为不同的类

不要为此使用继承。相反,存储IsRegistered标志