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

时间:2016-06-29 19:54:45

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

您好我有以下型号

模板(身份证,姓名) UserBody(身份证,姓名) EmployeeBody(Id,Name) 然后我有一个模板映射器,我将模板与众多模板中的一个相关联 用户和雇员。

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

我需要一个TemplatesMaps,它包含1个模板ID映射到许多Userbody.id和许多EmployeeBody.Id' s 示例

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

我的代码如下

In my /etc/profile:
#Gtk3 forced:
#export SWT_GTK3=1
#Gtk2 forced:
export SWT_GTK3=0

2 个答案:

答案 0 :(得分: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() =&gt; WithMany(e => e.TemplateMaps)

答案 1 :(得分:0)

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

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

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