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 = 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 の基本原則です。

代わりに、モデルの設計を修正する必要があります。私がしばらく前に書いたように

優れたオブジェクト リレーショナル マッピングを設計する際に克服しなければならない精神的な障壁の 1 つは、主にオブジェクト指向の用語またはリレーショナルの用語のうち、自分の性格に合った用語で考える傾向があることです。ただし、優れたオブジェクト リレーショナル マッピングには、優れたオブジェクト モデルと優れたリレーショナル モデルの両方が組み込まれています。たとえば、People 用のテーブルと、Employees および Customers 用の関連テーブルを含むデータベースがあるとします。1 人の人物が 3 つのテーブルすべてにレコードを持っている場合があります。ここで、厳密なリレーショナルの観点から、従業員用のデータベース VIEW と顧客用のデータベース VIEW を構築できます。どちらも People テーブルの情報を組み込んでいます。いずれかのビューを使用する場合、個人を一時的に「ただの」従業員または「ただの」顧客と考えることができます。両方だとわかっていても。したがって、この世界観から来る人は、Employee と Customer が両方とも Person の (直接の) サブクラスである OO マッピングを実行したくなるかもしれません。しかし、これは私たちが持っているデータでは機能しません。1 人の人物が従業員と顧客の両方のレコードを持っているため (また、具体的なサブタイプの従業員と顧客を同時に持つことができる人物インスタンスがないため)、人物と従業員の間の OO 関係は、継承ではなく合成である必要があり、人物と顧客についても同様です。

于 2010-08-19T13:15:12.410 に答える