正在从导航属性迁移到实体框架中的外键

本文关键字:框架 实体 导航 属性 迁移 | 更新日期: 2023-09-27 18:28:02

我目前有一个EF实体,具有正确的导航,类似于:

public class Person
{
  public int Id { get;set;};
  public string Name { get;set;};
  public virtual Office WorkingAt { get;set;}
}
public class Office
{
  public int Id {get;set;}
  public string Name { get;set;}
  public string Address {get;set;}
}

我想从对WorkingAt使用"Navigation Property"更改为对Office对象的Id的简单引用。

我该怎么做?我不清楚迁移路径应该是什么。

我的数据库中已经有数据了,Person表中包含一个我想继续使用的Office_Id列。

正在从导航属性迁移到实体框架中的外键

您不需要在代码中将字段表示为外键。由于您没有导航属性,所以就EF而言,它只是Person表上的一列。您没有使用导航属性,无论它是否是外键都无关紧要,因为您不能再使用它来自动联接到Office表。

由于它已经在数据库中使用Office_Id作为外键,您只需要执行以下操作:

public class Person
{
    public int Id { get;set;}
    public string Name { get;set;}
    public int Office_Id  { get; set; }
}

然后运行Add-Migration。它可能会尝试删除Up方法中的外键(并将其添加回Down方法中)。删除这两条涉及外键的行。理想情况下,UpDown方法应该为空。

正如这里与实体框架代码优先讨论的那样,您需要至少有一个导航属性才能使您的关系正常工作。

但是,如果你想保留你的导航属性(为了避免处理迁移),只想在模型中添加一个外键,那么你可以使用ForeignKey DataAnnotation来完成。通过这种方式,您可以明确地告诉实体框架您的意图。

public class Person
{
  public int Id { get;set;}
  public string Name { get;set;}
  [ForeignKey("Office")]
  public int OfficeId { get; set; }
  public virtual Office WorkingAt { get;set;}
}

实现这一点的另一种方法是将ForeignKey注释添加到导航属性中,并告知哪个属性将充当外键:

public class Person
{
  public int Id { get;set;}
  public string Name { get;set;}      
  public int OfficeId { get; set; }
  [ForeignKey("OfficeId")]
  public virtual Office WorkingAt { get;set;}
}