声明的导航类型 属性 XYZ 与指定导航的结果不兼容
The declared type of navigation property XYZ is not compatible with the result of the specified navigation
您好,我有以下型号
模板(ID、名称)
用户主体(ID,名称)
EmployeeBody(身份证,姓名)
然后我有一个模板映射器,我将模板与许多模板之一相关联
用户和雇员。
TemplatesMaps (id, TemplateId, UserId, EmployeeId) userid 和 employeeId 可以为空
我需要一个 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);
TemplatesMaps (Id, TemplateId, UserId, EmployeeId)
看起来更像一个联结点 table,因此需要不同的实体模型:
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 不知道如何获取所有这些记录并将它们变成内存中的单个模板对象。
假设这些是一对多关系(每个员工只能在一个模板中,每个用户只能在一个模板中)你的外键在错误的一边。 Employee 和 User 都应该有 TemplateIds。
如果您有多对多关系,则需要一个新的 table 来表示关联。参见 associative entity。
您好,我有以下型号
模板(ID、名称) 用户主体(ID,名称) EmployeeBody(身份证,姓名) 然后我有一个模板映射器,我将模板与许多模板之一相关联 用户和雇员。
TemplatesMaps (id, TemplateId, UserId, EmployeeId) userid 和 employeeId 可以为空
我需要一个 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);
TemplatesMaps (Id, TemplateId, UserId, EmployeeId)
看起来更像一个联结点 table,因此需要不同的实体模型:
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 不知道如何获取所有这些记录并将它们变成内存中的单个模板对象。
假设这些是一对多关系(每个员工只能在一个模板中,每个用户只能在一个模板中)你的外键在错误的一边。 Employee 和 User 都应该有 TemplateIds。
如果您有多对多关系,则需要一个新的 table 来表示关联。参见 associative entity。