EF Core Navigational属性以及该键以外的属性

时间:2019-09-09 08:52:02

标签: c# entity-framework entity-framework-core

在不使用键属性而是另一个外键创建导航属性时遇到问题。

public class Operation {
    public int Id { get; set; }
    public string Name { get; set; }
    public int CodeId { get; set; }
    public Code Code { get; set; }
    public List<Task> Tasks { get; set; }
}

public class Task {
    public int Id { get; set; }
    public string Name { get; set; }
    public int CodeId { get; set; }
    public Code Code { get; set; }
    public List<Task> Tasks { get; set; }
}

public class Code {
    public int Id { get; set; }
    public string Name { get; set; }
}

ModelBuider里面,我有

modelBuilder.Entity<Operation>().HasKey(g => g.Id);
modelBuilder.Entity<Operation>().HasMany(x => x.Task).WithOne()
            .HasForeignKey(x => x.CodeId).HasPrincipalKey(x => x.CodeId);

modelBuilder.Entity<Task>().HasKey(g => g.Id);

modelBuilder.Entity<Code>().HasKey(g => g.Id);

在这里我要进行操作,该操作具有导航属性Tasks。但是,此导航属性不是通过Task直接链接到Id类,而是通过CodeId链接。因此,基本上,在获取Operation时,我想Include()Tasks都具有相同的CodeId

所以查询部分可以正常工作,但是当我尝试更新Operation实体时,出现异常:

  

消息:“实体类型'Operation'的属性'CodeId'是键的一部分,因此不能被修改或标记为已修改。要使用标识的外键更改现有实体的主体,请先删除从属和调用“ SaveChanges”,然后将依赖项与新主体关联。”

有意义的是CodeId不是实际的密钥或属性。但是,如果我从配置中删除了HasPrincipalKey(x => x.CodeId),我将无法正确使用Include()

modelBuilder.Entity<Operation>().HasKey(g => g.Id);
modelBuilder.Entity<Operation>().HasMany(x => x.Task).WithOne()
            .HasForeignKey(x => x.CodeId).HasPrincipalKey(x => x.CodeId);

那么我该如何使用未通过主外键直接链接的导航属性?

0 个答案:

没有答案