您好我有以下型号
模板(身份证,姓名) 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
答案 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; }
到任何Template
,UserBody
和EmployeeBody
类。只需确保相应地更新相应的WithMany
配置,即WithMany()
=&gt; WithMany(e => e.TemplateMaps)
。
答案 1 :(得分:0)
你的两个模特不同意。在您的示例中,每个模板记录都有0..1 Employee和0..1 User。您有多个具有相同TemplateId的记录,但它们仍然是不同的记录。 EF不知道如何获取所有这些记录并将它们转换为内存中的单个Template对象。
假设这些是1对多的关系(每个Employee只能在一个模板中,每个用户只能在一个模板中),你的外键是错误的。员工和用户都应该有TemplateIds。
如果您有多对多关系,则需要一个新表来表示关联。请参阅associative entity。