声明的导航属性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);
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)
。
你的两个模型不一致。在您的示例中,每个Template记录有0..1雇员和0..1用户。您有多个具有相同TemplateId的记录,但它们仍然是不同的记录。EF不知道如何在内存中获取所有这些记录并将它们转换为单个Template对象。
假设这些是一对多的关系(每个Employee只能在一个模板中,每个User只能在一个模板中),您的外键位于错误的一侧。Employee和User都应该有templateid。
如果您有多对多关系,您将需要一个新表来表示该关联。