与Entity Framework有两个多对多关系的相同表

时间:2015-11-25 18:33:48

标签: asp.net asp.net-mvc entity-framework

我尝试使用相同的中间表在Entity Framework中创建两对多关系。

是否可以使用相同的表使用Entity Framework进行两种关系?

public class Alert
{
    public Alert()
    {
        Users = new HashSet<SXUser>();
        Groups = new HashSet<Group>();
    }

    public Guid AlertId { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }

    public virtual ICollection<SXUser> Users { get; set; }
    public virtual ICollection<Group> Groups { get; set; }
}

public class SXUser
{
    public Guid UserId { get; set; }
    public string Name { get; set; }
}

public class Group
{
    public int GroupId { get; set; }
    public string Description { get; set; }
}

在数据库中我有:

Database

如何在映射中配置关系? 我试过了:

public class AlertMap : EntityTypeConfiguration<Alert>
{
    public AlertMap()
    {
        // Primary Key
        HasKey(t => t.AlertId);

        // Properties
        Property(t => t.AlertId).IsRequired()
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        Property(t => t.Code).IsRequired()
            .HasColumnAnnotation(
                IndexAnnotation.AnnotationName,
                new IndexAnnotation(new IndexAttribute("AK_Alert", 1) { IsUnique = true })
            );

        Property(t => t.Name).IsRequired();


        // Relationships
        HasMany(t => t.Users).WithMany().Map(t=>t.ToTable("AlertRecipient").MapLeftKey("AlertId").MapRightKey("UserId"));
        HasMany(t => t.Groups).WithMany().Map(t => t.ToTable("AlertRecipient").MapLeftKey("AlertId").MapRightKey("GroupId"));
    }
}

有可能吗?

1 个答案:

答案 0 :(得分:0)

如果使用中间表,则只能在每个警报/用户中定义该中间表的ICollection。例如用户:

virtual ICollection<AlertRecipient> {get; set;}

表示Alertrecipient:

virtual Alert {get; set;}
virtual User {get; set;}

同时在Alert模型中添加UserAlertrecipient的ID。 在流畅的API中,Alertrecipient的映射将如下所示:

ModelBuilder<AlertRecipient>().HasRequired(e => e.User)
.WithMany(e => e.AlertRecipient).HasForeignKey(e => e.UserIDInMiddleTable);

我从来没有用一张桌子做过两对多的关系,但我想用这种技术应该是可能的。