0

使用 EF Code First 我有一个模型对象,它具有与单个模型对象关联的多个属性:

public class Job 
{
    public int Id { get; set; }
    public int Company1Id { get; set; }
    public int Company2Id { get; set; } // References CompanyId
    public int Company3Id { get; set; } // References CompanyId
    ...

    public virtual Company Company1Info { get; set; }
    public virtual Company Company2Info { get; set; }
    public virtual Company Company3Info { get; set; }
 }

 public class Company
 { 
    public int CompanyId { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
 }

JobMap 类中的关系

        this.HasRequired(t => t.Company1Info)
            .WithMany()
            .HasForeignKey(d => d.Company1Id);
        this.HasRequired(t => t .Company2Info)
            .WithMany()
            .HasForeignKey(d => d.Company2Id);
        this.HasRequired(t => t.Company3Info)
            .WithMany()
            .HasForeignKey(d => d.Company3Id);

我的仓库中获取数据的方法

 public Job GetById(int id)
    {
        return _dbContext.Set<Job>()
            .Include(t => t.Company1Info)
            .Include(t => t.Company2Info)
            .Include(t => t.Company3Info)
            .First(x => x.Id == id);
    }

当我运行应用程序时, Company2Info 和 Company3Info 为空。我尝试在上下文中为每家公司设置一个新的 DbSet 实例,但我得到了一个Unsupported Exception.

谢谢!

更新:这是同一问题的答案,但这对我不起作用Entity Framework Code First - 来自同一个表的两个外键

4

1 回答 1

0

解决方案:

我在问题中的设置和链接中的解决方案是正确的。由于键不存在,我创建实例的对象模型为空——换句话说,我试图引用的公司的 ID 不存在。

我所做的唯一更改是添加WillCascadeOnDelete方法并将其设置false为默认值为 true ——注意我在 JobMap 类中使用 Fluent API 而不是 Context ModelBuilder。

JobMap 类中的关系

    this.HasRequired(t => t.Company1Info)
        .WithMany()
        .HasForeignKey(d => d.Company1Id)
        .WillCascadeOnDelete(false);
    this.HasRequired(t => t .Company2Info)
        .WithMany()
        .HasForeignKey(d => d.Company2Id)
        .WillCascadeOnDelete(false);
    this.HasRequired(t => t.Company3Info)
        .WithMany()
        .HasForeignKey(d => d.Company3Id)
        .WillCascadeOnDelete(false);

高温高压

于 2012-05-22T12:07:45.503 回答