28441

[code]

    public class Hoge1
    {
        public int Id { get; set; }
        public Hoge2 Hoge2 { get; set; }
    }
    public class Hoge2
    {
        public string Value { get; set; }
    }
    
[/code]

このようなクラスで Update-Database でHoge1テーブルを生成すると、

[code]

    Id
    Hoge2_Value
    
[/code]

の列を持った Hoge1テーブルが作成されます。  
クラスの入れ子をさらに増やして、

[code]

    public class Hoge1
    {
        public int Id { get; set; }
        public Hoge2 Hoge2 { get; set; }
    }
    public class Hoge2
    {
        public string Value { get; set; }
        public Hoge3 Hoge3 { get; set; }
    }
    public class Hoge3
    {
        public string Value { get; set; }
    }
    
[/code]

とした場合、 Update-Database は以下のエラーになってしまいます。

[code]

    モデルの生成中に 1 つまたは複数の妥当性確認エラーが見つかりました:
    xxxxx.Hoge2: : EntityType 'Hoge2' にはキーが定義されていません。この EntityType にはキーを定義してください。
    Hoge2: EntityType: EntitySet 'Hoge2' はキーが定義されていない型 'Hoge2' に基づいています。
    
[/code]

エラーにならずに、

[code]

    Id
    Hoge2_Value
    Hoge2_Hoge3_Value
    
[/code]

の形でテーブルを生成する方法はあるでしょうか？  
（階層化されたクラスをフラットなテーブルにマッピングしたい）


CC BY-SA 3.0
2016-08-22T14:09:47.820
28432
2016-08-23T04:15:28.480
3925
question
c# entity-framework
入れ子のクラスでコードファーストを使いたい


プロパティ型に対して`ComplexTypeAttribute`を指定します。

[code]

    [ComplexType]
    public class Hoge2
    {
        public string Value { get; set; }
    }
    
[/code]

また複合型プロパティの`get`は必ず`null`でないインスタンスを返す必要がありますので単純な自動実装プロパティは使用できません。手っ取り早い実装としては

[code]

    public Hoge2 Hoge2 { get; set; } = new Hoge2();
    
[/code]

のように初期化しておきます。


CC BY-SA 3.0
2016-08-23T04:10:20.513
28441
2016-08-23T04:15:28.480
2016-08-23T04:15:28.480
5750
5750
28432
answer