繁体   English   中英

使用泛型时如何与 EF 创建多对多关系

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM