2016-03-22 4 views
-2

私はメンバシップにいくつかの緊急情報を保存しなければならず、私はSQLテーブルを設計する方法に苦労しています。私はこれを見つけたvery useful old questionしかし、私はまだ答えに苦労しています。メンバーシップと連携するために最適な緊急連絡先パターンを設計するにはどうすればよいですか?

緊急連絡先が標準ユーザーと同じ情報を持つことに気づきました。それから、私はすでにそうしなければならないのと同じ構造を再利用したいと思います。 てみましょう私はこれまでのところ(私は最初のコードを使用し、C#と私はデモの目的のためにモデルを単純化)したものをお見せ:

会員テーブル

public class Membership 
{ 
    public string Id { get; set; } 
    public tring PhoneNumber { get; set; } 
    public tring UserName { get; set; } 
    public tring Email { get; set; } 
    public bool IsDeactivated { get; set; } 
    public bool IsAccountClosed { get; set; } 
    /// <summary> 
    /// In some cases like teammate, a membership can be linked to another membership. We'll be able to build teammate and other scenario. 
    /// </summary> 
    public string MembershipGroupId { get; set; } 
    public int DisplayOrder { get; set; } 
    public virtual UserProfile UserProfile { get; set; } 
    /// <summary> 
    /// The most of the time, a membership will have some emergency contacts 
    /// </summary> 
    public virtual ICollection<EmergencyContact> EmergencyContacts { get; set; } 
} 
} 

緊急連絡がにリンクすることができた場合多くのメンバーシップとメンバーシップは多くの緊急連絡先を持つことができます。

EmergencyContact

public class EmergencyContact : Entity 
    { 
     public string MembershipId { get; set; } 
     public string MembershipEmergencyId { get; set; } 
     public virtual Membership Membership { get; set; } 
     public virtual Membership MembershipEmergency { get; set; } 
    } 

そして、私は以下のようにFluentAPI定義:

modelBuilder.Entity<EmergencyContact>() 
       .HasKey(x => new { x.MembershipId, x.MembershipEmergencyId }); 


// EmergencyMembership to Membership 
      modelBuilder.Entity<EmergencyContact>() 
       .HasRequired(x => x.Membership) 
       .WithMany(x => x.EmergencyContacts) 
       .HasForeignKey(x => x.MembershipId); 

      // EmergencyMembership to MembershipEmergencyId 
      modelBuilder.Entity<EmergencyContact>() 
       .HasRequired(x => x.MembershipEmergency) 
       .WithMany(x => x.EmergencyContacts) 
       .HasForeignKey(x => x.MembershipEmergencyId); 

そして最後に、私は有効ではありません スキーマが指定され、このエラーを得ました。エラー:EmergencyContact_Membership 'というタイプのメンバーシップが使用できないため、ロードされませんでした。

ご覧のとおり、EmergencyContactでは、緊急連絡先には他のユーザーと同じ標準メンバーシップが存在することが予想されるため、EmergencyContactはメンバーシップを2回指します。 FluentAPIの縫い目はそれほど好きではありません。私はこれを機能させるためにいくつかの助けが必要です。

は、私は多くの検索後に答えを得た

デビッド

+0

- メンバーシップは非常に古いとカスタマイズが非常に簡単ではありません。選択肢がある場合は、[ASP.NET ID](http://www.asp.net/mvc/overview/security)を使用する方がよいでしょう。プロファイル情報を追加したり、ASP.NET IdentityフレームワークでDIを設定する方がはるかに簡単です。 – NightOwl888

+0

@ NightOwl888実際、ここのメンバーシップはASP.NETアイデンティティです。私は、メンバーシップ情報(パスワード、LastLoginDateなど)とユーザープロフィール情報(姓名、住所など)の間の情報を簡単に認識するためにその名前を付けました。 DIもすべて動作します。私はUnityを使用して精密化されます。だから私はちょうどEmergencyContactsを正しく設計する必要があります:) –

+0

私の質問は、多くの自己参照のように見えます。私はそれについて調査します... http:// stackoverflow。com/questions/5125052/self-referencing-many-to-many-recursive-relationship-code-first-entity-framework –

答えて

0

、ありがとうございました!私がしたかったことは、「多対多自己参照」と呼ばれています。 私のアプリケーションでは、緊急連絡先の関係を保存するために既に持っているのと同じ構造(メンバーシップとユーザープロファイルテーブル)を使用することを期待しています。 そうするために、私の質問を見ると、EmergencyContactテーブルが良く、MembershipテーブルのICollectionも良かったです。

重要なのはFluent APIです。定義の方法は、自己参照の多くの多くは、このようなものです:これは他の誰かに助けることができる

modelBuilder.Entity<EmergencyContact>() 
       .HasKey(x => new { x.MembershipId, x.MembershipEmergencyId }); 

// 
      // For intance, David's membership can have a Joseph, Andrée and René membership as emergency contacts 
      // and those one can also be used as emergency contacts by Adeline's membership. 
      // 
      // A membership can have many emergencycontact 
      modelBuilder.Entity<Membership>() 
       .HasMany(x => x.EmergencyContacts) 
       .WithRequired(x => x.Membership) 
       .HasForeignKey(x => x.MembershipId) 
       .WillCascadeOnDelete(); 

      // An emergencycontact can have many membership. 
      modelBuilder.Entity<EmergencyContact>() 
       .HasRequired(x => x.MembershipEmergency) 
       .WithMany() 
       .HasForeignKey(x => x.MembershipEmergencyId) 
       .WillCascadeOnDelete(false); 

希望、

デビッドFYI

関連する問題