Объявленный тип свойства навигации 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.
Если у вас есть отношения "многие ко многим", вам понадобится новая таблица для представления ассоциации. Смотрите ассоциативную сущность.