[英]How to create many to many relation with EF when using generic
我有一个名为 Entity 的抽象 class 定义如下:
public abstract class Entity<T> : IEntity<T>
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public T Id { get; set; }
..
}
这里有几个我正在使用的数据实体类:
public class Company : Entity<Guid>
{
...
}
public class User : Entity<Guid>
{
...
}
默认情况下,实体将为这两个类提供一个 Id 属性,在本例中为 Guid 类型,并且我使用流利的 API 的配置为每个类在创建相关表时使用更相关的名称重命名 Id 属性. 比如对于我公司的配置
this.HasKey(u => u.Id)
.Property(p => p.Id)
.HasColumnName("CompanyId")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
到目前为止一切顺利,一切都按预期工作,但我的要求已经改变,我现在需要在公司和用户之间创建多对多关系,所以我尝试在我的OnModelCreating
方法中定义关系:
modelBuilder.Entity<Company>()
.HasMany(s => s.Users)
.WithMany(c => c.Companies)
.Map(cs =>
{
cs.MapLeftKey("UserRefId");
cs.MapRightKey("CompanyRefId");
cs.ToTable("CompanyUsers");
});
但是当我尝试更新我的数据库时,我收到以下错误:
Schema specified is not valid. Errors: The relationship 'Data.Company_Users' was
not loaded because the type 'Data.Company' is not available.
如果我颠倒顺序:
modelBuilder.Entity<User>()
.HasMany(s => s.Organizations)
.WithMany(c => c.Users)
.Map(cs =>
{
cs.MapLeftKey("OrganizationRefId");
cs.MapRightKey("UserRefId");
cs.ToTable("OrganizationUsers");
});
我收到以下错误:
在 model 生成期间检测到一个或多个验证错误:
CompanyId: : 在角色“User_Companies_Target”引用的类型中没有定义名称为“CompanyId”的属性。 User_Companies_Source::多重性在关系“User_Companies”中的角色“User_Companies_Source”中无效。 主要角色多重性的有效值为“0..1”或“1”。
当我的实体从抽象 class 继承并且它们都没有在各自的 class 中定义的 UserId 或 CompanyId 时,我如何解决这个问题的任何想法,因为两者都从抽象 ZA2F2ED4F8EBC2CBB4C21A29DC40 继承 Id 属性,并且仅在生成表时重命名和重命名 DZAB .
我希望以上是有道理的。 如果没有,请告诉我,我会尽力澄清。
谢谢
我最终发现了问题所在:我愚蠢地留下了已经在用户和公司实体中定义的现有外部关系:
在公司实体中:
this.HasMany(u => u.Users)
.WithRequired(o => o.Company)
.HasForeignKey(o => o.CompanyId);
在用户实体中:
this.HasRequired(u => u.Company)
.WithMany(u => u.Users)
.HasForeignKey(s => s.CompanyId);
一旦我删除了这些并使用:
modelBuilder.Entity<User>()
.HasMany(s => s.Companies)
.WithMany(c => c.Users)
.Map(cs =>
{
cs.MapLeftKey("CompanyRefId");
cs.MapRightKey("UserRefId");
cs.ToTable("CompanyUsers");
});
当我创建迁移时,它按预期工作并生成了相关脚本:
CreateTable(
"dbo.CompanyUsers",
c => new
{
CompanyRefId = c.Guid(nullable: false),
UserRefId = c.Guid(nullable: false),
})
.PrimaryKey(t => new { t.CompanyRefId, t.UserRefId })
.ForeignKey("dbo.Users", t => t.CompanyRefId, cascadeDelete: true)
.ForeignKey("dbo.Companies", t => t.UserRefId, cascadeDelete: true)
.Index(t => t.CompanyRefId)
.Index(t => t.UserRefId);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.