0

我正在尝试仅使用 EF4 代码来解决问题。如果我使用 TPH 并且我想将保存的人员更改为讲师,反之亦然,我将如何完成此操作。我的 POCO 课程:

    public class Person
{
    public int PersonId { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}
public class Instructor : Person
{
    public DateTime? HireDate { get; set; }
}

public class Student : Person
{
    public DateTime? EnrollmentDate { get; set; }
}

public class Admin : Person
{
    public DateTime? AdminDate { get; set; }
}

public class PersonConfiguration : EntityConfiguration<Person>
{
    public PersonConfiguration()
    {
        this.HasKey(u => u.PersonId).Property(u => u.PersonId).IsIdentity();
        MapHierarchy()
            .Case<Person>(p => new
            {
                p.PersonId,
                p.FirstName,
                p.LastName,                    
                PersonCategory = 0
            })
            .Case<Instructor>(i => new
            {

                i.HireDate,
                PersonCategory = 1
            })
            .Case<Student>(s => new
            {
                s.EnrollmentDate,
                PersonCategory = 2
            })
            .Case<Admin>(a => new
            {

                a.AdminDate,
                PersonCategory = 3
            }).ToTable("Person");

    }
}

假设我有一个人:

var person1 = new Person { FirstName = "Bayram", LastName = "Celik" };
context.People.Add(person1);
context.SaveChanges();

后来我想让这个人成为管理员。我将如何做到这一点。

var person = context.People.FirstOrDefault();
Admin test = person as Admin; // wont work

以下将更改 HireDate 列,但我的鉴别器字段 PersonCategory 仍为 0。因此,就 EF 而言,它仍然不是 Admin 类型

Admin admin = new Admin();
admin.PersonId = person.PersonId;
admin.AdminDate = DateTime.Now;

context.ObjectContext.Detach(person);
context.People.Attach(admin);
var customerEntry = context.ObjectContext.ObjectStateManager.GetObjectStateEntry(admin);
customerEntry.SetModified();
customerEntry.SetModifiedProperty("AdminDate");
4

1 回答 1

2

您永远无法更改对象的类型。您不能在 C# 中执行此操作,并且 EF 无法解决此问题。这是 OOP 的基本原则。

相反,您需要修复模型设计。正如我不久前写的

在设计一个好的对象关系映射时,你必须克服的心理障碍之一是倾向于主要以面向对象的术语或关系术语来思考,这取决于你的个性。然而,一个好的对象关系映射同时包含一个好的对象模型和一个好的关系模型。例如,假设您有一个数据库,其中包含一个人员表,以及员工和客户的相关表。一个人可能在所有三个表中都有记录。现在,从严格关系的角度来看,您可以为员工构建一个数据库 VIEW,为客户构建另一个数据库,这两个数据库都包含来自 People 表的信息。使用一个视图或另一个视图时,您可以暂时将个人视为“只是”一个员工或“只是”一个客户,即使你知道他们都是。因此,来自这种世界观的人可能会尝试进行 OO 映射,其中 Employee 和 Customer 都是 Person 的(直接)子类。但这不适用于我们拥有的数据;由于一个人同时拥有员工和客户记录(并且由于没有任何 Person 实例可以同时属于具体子类型 Employee 和 Customer),Person 和 Employee 之间的 OO 关系需要是组合而不是继承,对于 Person 和 Customer 也是如此。

于 2010-08-19T13:15:12.410 回答