我尝试使用相同的中间表在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; }
}
在数据库中我有:
如何在映射中配置关系? 我试过了:
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"));
}
}
有可能吗?
答案 0 :(得分:0)
如果使用中间表,则只能在每个警报/用户中定义该中间表的ICollection。例如用户:
virtual ICollection<AlertRecipient> {get; set;}
表示Alertrecipient:
virtual Alert {get; set;}
virtual User {get; set;}
同时在Alert
模型中添加User
和Alertrecipient
的ID。
在流畅的API中,Alertrecipient
的映射将如下所示:
ModelBuilder<AlertRecipient>().HasRequired(e => e.User)
.WithMany(e => e.AlertRecipient).HasForeignKey(e => e.UserIDInMiddleTable);
我从来没有用一张桌子做过两对多的关系,但我想用这种技术应该是可能的。