【问题标题】:The declared type of navigation property XYZ is not compatible with the result of the specified navigation导航属性 XYZ 的声明类型与指定导航的结果不兼容
【发布时间】:2016-06-29 19:54:44
【问题描述】:

您好,我有以下型号

模板(ID、名称) 用户主体(ID、名称) EmployeeBody(ID、姓名) 然后我有一个模板映射器,我将一个模板与许多模板之一相关联 用户和员工。

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

我需要一个 TemplatesMaps 包含 1 个映射到许多 Userbody.id 和许多 EmployeeBody.Id 的 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);

【问题讨论】:

    标签: c# .net entity-framework ef-code-first navigation-properties


    【解决方案1】:

    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; }
    

    到任何TemplateUserBodyEmployeeBody 类。只需确保相应地更新相应的WithMany 配置,即WithMany() => WithMany(e =&gt; e.TemplateMaps)

    【讨论】:

      【解决方案2】:

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

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

      如果您有多对多关系,则需要一个新表来表示关联。见associative entity

      【讨论】:

        猜你喜欢
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 2012-11-26
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多