首先是EF代码,多态性转换

时间:2011-07-29 12:53:56

标签: 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 { get; set; }
        public virtual ICollection<Team> ChildTeams { get; set; }

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

public class RegisteredPerson : Person
    {
        public int ProxyId { get; set; }
    }

注册人继承人。

在某个时刻,该人成为注册人。但这个人已经被团队所束缚了。

如何将人员转移给注册人,而不会丢失与其他数据库的链接?

2 个答案:

答案 0 :(得分:0)

据我所知,你不能向下倾倒。您可以使用automapper等地图库将对象映射到 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);
}

希望这会有所帮助......

答案 1 :(得分:0)

你的问题在于这句话:

  

在某个时刻,该人成为注册人

在静态OOP中,类的实例不能“变成”不同的类。

不要使用继承。而是存储IsRegistered标志。