4

私はコード ファーストのアプローチを使用しており、EF がテーブルを作成する方法の動作を変更しようとしています。2 つの単純なクラスがあります。

注: 毎回データベースを削除して再作成しています。これは現実の世界では起こりませんが、テストのために、作成を傍受し、EF に思い描いた方​​法でデータベースを作成させようとしています。

public class Person
{
  public int PersonId { get; private set; }
  public string Forename { get; set; }
}
public class Officer : Person
{
  public int OfficerId { get; private set; }
  public bool IsManager { get; set; }
}

私の OnModelCreating() イベントには、次のものがあります。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();


        modelBuilder.Entity<Person>().HasKey(x => x.PersonId);
        modelBuilder.Entity<Person>().ToTable("Person");
        modelBuilder.Entity<Officer>().HasKey<int>(x => x.OfficerId);
        modelBuilder.Entity<Officer>().ToTable("Officer");
    }

問題は、データベースが作成されると、テーブルが次のように作成されることです。

表: Person PersonId INT PK Forename nvarchar(50)

表: Officer PersonId INT PK、FK IsManager BIT OfficerId INT

私には、これは従来の命名規則、つまり TableNameId に従っていないため、間違っているように見えます。

これに関するヘルプは大歓迎です。前もってありがとう、オナム。

4

2 に答える 2

3

Entity Framework はこの行を無視します...

modelBuilder.Entity<Officer>().HasKey<int>(x => x.OfficerId);

...ここで行った基本エンティティに対してのみ、派生エンティティに対して個別にキーを定義することはできないためPerson:

modelBuilder.Entity<Person>().HasKey(x => x.PersonId);

このキーと対応する列名PersonIdは、基本エンティティと派生エンティティのすべてのテーブルに使用されます。Code-First では、派生テーブルのキー列にベース テーブル以外の名前を付ける方法はありません。

OfficerId派生エンティティのOfficerは通常のスカラー プロパティとして扱われ、表では ではOfficerId INTないものとして表示されますPK

Officer 命名規則に関しては、 anは a であると主張できるPersonので、 key を呼び出すのが理にかなっているかもしれませんPersonId。これは、リレーショナルやテーブルの観点からというよりも、オブジェクト指向からの命名規則です。

于 2013-05-20T19:06:25.520 に答える
1

あなたのクラス構造は少し間違っています。理想的には、抽象クラスに person と言ってから派生させるか、単に役員クラスから役員 ID を削除する必要があります。そうしないと、officer テーブルに personid というフィールドがあり、これは単なる冗長フィールドであり、使用できません。代わりにできることは

public class PersonBase {public string ForeName{get; set;}}
public class Person : PersonBase {public int PersonId{get; set;}}
public class Officer : PersonBase{public int OfficerId{get; set;} public bool IsManager{get; set;}}

または、マップされた EF フィールドの列名を変更するには、[Column(Name="COLOUMN NAME")]属性を使用できます

于 2013-05-20T17:52:42.290 に答える