Объявленный тип свойства навигации XYZ не совместим с результатом указанной навигации

Привет У меня есть следующая модель

Template (Id,Name) UserBody (Id, name) EmployeeBody (Id, Name) У меня тогда есть сопоставители шаблонов, где я связываю шаблон с одним из многих пользователей и работаю.

TemplatesMaps (id, TemplateId, UserId, EmployeeId) ИД-пользователя и employeeId могут иметь значение null

Мне нужно, чтобы TemplatesMaps состоял из 1 сопоставления templateid для многих Userbody.id и многих примеров EmployeeBody.Id.

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

2 ответа

Решение

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, UserBody а также EmployeeBody классы. Просто не забудьте обновить соответствующий WithMany конфигурация соответственно, т.е. WithMany() => WithMany(e => e.TemplateMaps),

Ваши две модели не согласны. В вашем примере каждая запись шаблона имеет 0..1 Сотрудник и 0..1 Пользователь. У вас есть несколько записей с одним и тем же TemplateId, но они все еще разные. EF не знает, как взять все эти записи и превратить их в один объект Template в памяти.

Предполагая, что это отношения "один ко многим" (каждый сотрудник может быть только в одном шаблоне, каждый пользователь может быть только в одном шаблоне), ваши внешние ключи находятся не на той стороне. Сотрудник и пользователь должны иметь TemplateIds.

Если у вас есть отношения "многие ко многим", вам понадобится новая таблица для представления ассоциации. Смотрите ассоциативную сущность.

Другие вопросы по тегам