声明的导航属性XYZ的类型与指定导航的结果不兼容

本文关键字:导航 结果 不兼容 类型 属性 XYZ 声明 | 更新日期: 2023-09-27 17:53:21

你好,我有以下模型

模板(Id、名称)UserBody (Id, name)EmployeeBody (Id, Name)然后我有一个模板映射器,我将模板与许多模板相关联用户和失业。

TemplatesMaps (id, TemplateId, UserId, EmployeeId) UserId和EmployeeId可为空

我需要一个TemplatesMaps包含1 templateid映射到许多用户体。我的同事和许多员工。身份证的示例

Id   TemplateId UserBodyId, EmployeeBodyId
1    1          1           Null
2    1          Null        Null  
3    2          4           Null
4    2          Null        5

我的代码如下

  public class UserBody 
  {
    [Key]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
  }
  public class EmployeeBody
  {
    [Key]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
  }
  public class Template
  {
    [Key]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
  }
  public class TemplatesMaps
  {
    [Key]
    public virtual int Id { get; set; }
    public virtual Template Template { get; set; }
    public virtual ICollection<EmployeeBody> Employees { get; set; }
    public virtual ICollection<UserBody> Users { get; set; }
  }
  public class MyDbContext : DbContext
  { 
    public virtual IDbSet<EmployeeBody> EmployeeBody { get; set; }
    public virtual IDbSet<UserBody> UserBody { get; set; }
    public virtual IDbSet<Template> Templates { get; set; }
    public virtual IDbSet<TemplatesMaps> TemplatesMaps { get; set; }

    public MyDbContext() : base("Default")
    {
      Database.SetInitializer<TrawlerDbContext>(null);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<TemplatesMaps>().HasOptional(o => o.Employees).WithMany().Map(m => m.MapKey("EmployeeId"));
      modelBuilder.Entity<TemplatesMaps>().HasOptional(o => o.Usersus).WithMany().Map(m => m.MapKey("UserId"));
      base.OnModelCreating(modelBuilder);
    }

    //when i run the following i get the error  The declared type of navigation property XYZ is not compatible with the result of the specified navigation.
    var test = _templateMapperRepo.GetAll().Where(x => x.Template.Id == input.TemplateId).Include(x => x.Users).Include(xx => xx.Employees);

声明的导航属性XYZ的类型与指定导航的结果不兼容

TemplatesMaps (Id, TemplateId, UserId, EmployeeId)看起来更像一个连接表,因此需要一个不同的实体模型:

public class TemplatesMaps
{
    [Key]
    public virtual int Id { get; set; }
    public virtual Template Template { get; set; }
    public virtual EmployeeBody Employee { get; set; }
    public virtual UserBody User { get; set; }
}

设置
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<TemplatesMaps>().HasRequired(o => o.Template).WithMany().Map(m => m.MapKey("TemplateId"));
    modelBuilder.Entity<TemplatesMaps>().HasOptional(o => o.Employee).WithMany().Map(m => m.MapKey("EmployeeId"));
    modelBuilder.Entity<TemplatesMaps>().HasOptional(o => o.User).WithMany().Map(m => m.MapKey("UserId"));
    base.OnModelCreating(modelBuilder);
}

如果需要,可以添加反向导航属性

public virtual ICollection<TemplatesMaps> TemplateMaps { get; set; }

适用于Template, UserBodyEmployeeBody类中的任何一类。只要确保相应地更新相应的WithMany配置,即WithMany() => WithMany(e => e.TemplateMaps)

你的两个模型不一致。在您的示例中,每个Template记录有0..1雇员和0..1用户。您有多个具有相同TemplateId的记录,但它们仍然是不同的记录。EF不知道如何在内存中获取所有这些记录并将它们转换为单个Template对象。

假设这些是一对多的关系(每个Employee只能在一个模板中,每个User只能在一个模板中),您的外键位于错误的一侧。Employee和User都应该有templateid。

如果您有多对多关系,您将需要一个新表来表示该关联。