【问题标题】:EF code first, polymorphism castEF 代码优先,多态转换
【发布时间】:2011-07-29 12:53:55
【问题描述】:

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

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 转换为已注册的人,而不会丢失与其他数据库的链接?

【问题讨论】:

    标签: database polymorphism ef-code-first


    【解决方案1】:

    据我所知,你不能向下投射。您可以做的是使用像 automapper 这样的映射库将您的 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);
    }
    

    希望这会有所帮助...

    【讨论】:

      【解决方案2】:

      你的问题在于这句话:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多