2016-04-19 25 views
2

私がどのように見えるフィールドと呼ばれるエンティティ、持っている:Field.csEntity Frameworkのツリー構造

class Field 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

ので、フィールドは、このような単純なリストのようになります。

1 : First Name 
2 : Last Name 
3 : Gender 
4 : Passport 
5 : Driver License 
6 : Issued 
7 : Expired 
別のエンティティと呼ばれるバッチのそれぞれについて

、私はこのようになります。フィールドの任意の木を、持っていると思います。

最初のバッチ

 First Name |  Last Name  |  Passport   |  Gender 
             | Issued | Expired | 

またはこの:

第二のバッチ

 First Name |  Last Name  |  Gender  |  Driver License | 
                  | Issued | Expired | 

またはユーザーは、各フィールドに異なる値を入力したフィールドのいずれかの他の木、(いくつかのフィールドは見出しだけです(例:Passportなど)

私のフィールドは、再利用できる要素の一覧に過ぎず、バッチに基づいてそれらの間に何らかの関係があります。

Batch.csフィールドは「最初のバッチ」のために、このようになりますJSONツリーで

class Batch 
{ 
    public int Id { get; set; } 
    public string Fields { get; set; } 
    // other data... 
} 

{ 1, 2, 4: { 6, 7 }, 3 } 
私の考えのようなバッチエンティティの外観を持っていることでした

そして、第二のバッチのために、このような:

{ 1, 2, 3, 5: { 6, 7 } } 

バッチも、このような、より深くネストされたフィールドを持つことができる:

|    Passport    | 
|  Issued  |  Expired | 
| Month | Year | Month | Year | 

をこれはEFでこのような関係を格納するための最良の方法ですか? JSONフィールドを避け、データを正規化する必要がありますか?もしそうなら、EFモデルを使って任意のツリー関係を保存するにはどうすればいいですか?

+0

どのようにデータを保存するのか分かりませんが、その構造だけを表示します。データモデルはどのように見えますか? –

+1

これはモデルファーストなので、EFはテーブルを生成し、バッチレコードは次のように正確に記述されます。 ID:1 - フィールド: "{1,2,4:{6,7}、3}" 文字列のjsonを使用して、バッチのフィールドを表示します。 多分、ユーザーが入力したデータをどのように格納するのかということです。その場合は、基本的に同じフィールドにキーと値のペアを持つ同じjson構造に従って、nosqlデータベースに格納する予定です。 –

答えて

0

私はあなたがそれを動的にしたい場合、あなたはこのようなキーと値のテーブルを使用する必要があり、この

class Batch 
{ 
public int BatchId { get; set; } 
public string BachFirstName{ get; set; } 
public string BachLastName{ get; set; } 
public string BachGender{ get; set; } 
public Document BachDocument{ get; set; } 
} 

class Document 
{ 
public int DocId { get; set; } 
public string DocDesignation{ get; set; } 
public State DocState{ get; set; } 
} 


class State 
{ 
public int Id { get; set; } 
public string StateDesignation{ get; set; } 
public date StateDate{ get; set; } 
} 
+0

この解決策は機能しません。ユーザーが作成したダイナミックなリストはフィールドであり、そのリストはバッチに関連付けられ、質問に記載されている構造を形成します。 –

0

のような二つのクラスの文書と状態を作成することを示唆しています。この表の

namespace ConsoleApplication1 
{ 
    class Db : DbContext 
    { 
     public DbSet<User> Users { get; set; } 
     public DbSet<Batch> Batches { get; set; } 
    } 

    class User 
    { 
     [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int UserId { get; set; } 
     public virtual List<Batch> Batches { get; set; } 
    } 

    class Batch 
    { 
     [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int BatchId { get; set; } 
     [Required, MaxLength(256)] 
     public string Key { get; set; } 
     [MaxLength(512)] 
     public string Value { get; set; } 
     public virtual List<Batch> Children { get; set; } 
    } 

    class Initializer : DropCreateDatabaseAlways<Db> 
    { 
     protected override void Seed(Db context) 
     { 
      var user = new User(); 
      context.Users.Add(user); 
      user.Batches = new List<Batch>(); 
      user.Batches.AddRange(new List<Batch> 
      { 
       new Batch {Key = "First Name", Value = "John"}, 
       new Batch {Key = "Last Name", Value = "Smith"}, 
       new Batch {Key = "Passport", Children = new List<Batch> 
       { 
        new Batch {Key = "Issued", Value = "2014-02-03"}, 
        new Batch {Key = "Expired", Value = "2015-02-03"}, 
       }} 
      }); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Database.SetInitializer(new Initializer()); 
      using (var db = new Db()) 
      { 
       Console.WriteLine(JsonConvert.SerializeObject(db.Batches.ToList(), Formatting.Indented)); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 

生成Schema[User_UserId]がルートバッチのNULLではなく、[Batch_BatchId]は、ネストされたもののためNULLない

CREATE TABLE [dbo].[Batches](
    [BatchId] [int] IDENTITY(1,1) NOT NULL, 
    [Key] [nvarchar](256) NOT NULL, 
    [Value] [nvarchar](512) NULL, 
    [Batch_BatchId] [int] NULL, 
    [User_UserId] [int] NULL, 
CONSTRAINT [PK_dbo.Batches] PRIMARY KEY CLUSTERED 
(
    [BatchId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Batches] WITH CHECK ADD CONSTRAINT [FK_dbo.Batches_dbo.Batches_Batch_BatchId] FOREIGN KEY([Batch_BatchId]) 
REFERENCES [dbo].[Batches] ([BatchId]) 
GO 

ALTER TABLE [dbo].[Batches] CHECK CONSTRAINT [FK_dbo.Batches_dbo.Batches_Batch_BatchId] 
GO 

ALTER TABLE [dbo].[Batches] WITH CHECK ADD CONSTRAINT [FK_dbo.Batches_dbo.Users_User_UserId] FOREIGN KEY([User_UserId]) 
REFERENCES [dbo].[Users] ([UserId]) 
GO 

ALTER TABLE [dbo].[Batches] CHECK CONSTRAINT [FK_dbo.Batches_dbo.Users_User_UserId] 
GO 

です。このツリーは、あなたとあなたのビジネスロジックによって決まります。