如何设计最佳的紧急联系人模式以与 Membership 配合使用?

How to design an optimal Emergency Contact pattern to work with Membership?

我必须将一些紧急信息存储到会员中,并且我正在为如何设计 SQL table 而苦恼。我找到了这个 very useful old question,但我仍在努力寻找答案。

我注意到紧急联系人将拥有与标准用户相同的信息。然后我想重用我已经必须这样做的相同结构。 让我向您展示我目前拥有的东西(我首先使用代码,C# 并且出于演示目的我简化了模型):

会员资格table

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; }
}
}

如果一个紧急联系人可以链接到多个成员并且一个成员可以有多个紧急联系人,那么我应该创建多对多关系。

紧急联系人

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' 未加载,因为类型 Membership' 不可用。

如您所见,EmergencyContact 两次提及成员资格,因为我希望紧急联系人与任何其他用户一样具有标准成员资格。 FluentAPI 接缝不喜欢那样,我需要一些帮助才能使其正常工作。

非常感谢,

大卫

经过多次搜索,我得到了答案!我想做的事情叫做“多对多自引用”。 在我的应用程序中,我希望使用与现有结构相同的结构(Membership 和 UserProfile tables)来存储紧急联系人关系。 为此,如果您看一下我的问题,EmergencyContact table 很好,Membership table 中的 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);

希望这对其他人有帮助,

大卫