私はメンバシップにいくつかの緊急情報を保存しなければならず、私は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の縫い目はそれほど好きではありません。私はこれを機能させるためにいくつかの助けが必要です。
は、私は多くの検索後に答えを得た
デビッド
- メンバーシップは非常に古いとカスタマイズが非常に簡単ではありません。選択肢がある場合は、[ASP.NET ID](http://www.asp.net/mvc/overview/security)を使用する方がよいでしょう。プロファイル情報を追加したり、ASP.NET IdentityフレームワークでDIを設定する方がはるかに簡単です。 – NightOwl888
@ NightOwl888実際、ここのメンバーシップはASP.NETアイデンティティです。私は、メンバーシップ情報(パスワード、LastLoginDateなど)とユーザープロフィール情報(姓名、住所など)の間の情報を簡単に認識するためにその名前を付けました。 DIもすべて動作します。私はUnityを使用して精密化されます。だから私はちょうどEmergencyContactsを正しく設計する必要があります:) –
私の質問は、多くの自己参照のように見えます。私はそれについて調査します... http:// stackoverflow。com/questions/5125052/self-referencing-many-to-many-recursive-relationship-code-first-entity-framework –