C# 在实体框架中将表单导航属性迁移到外键

C# 在实体框架中将表单导航属性迁移到外键,c#,entity-framework,C#,Entity Framework,我目前有一个带有导航的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 stri

我目前有一个带有导航的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
的“导航属性”更改为对
Office
对象Id的简单引用

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

我的数据库中已经有数据,
Person
表包含一个
Office\u Id
列,我希望继续使用该列

如实体框架代码所述,首先,您需要至少有一个导航属性才能使关系正常工作

但是,如果您想保留导航属性(为了避免处理迁移),只需向模型中添加外键,那么可以使用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注释添加到navigation属性,并告知哪个属性将用作外键:

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;}
}

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

由于它已经在使用
Office\u Id
作为数据库中的外键,您只需执行以下操作:

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

    public int Office_Id  { get; set; }
}

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

谢谢,如果我只使用
[ForeignKey(“Office_Id”)]
我想它会选择现有的列名,一切都会像以前一样工作?我想是的,但如果不进行测试,我不确定。此外,我从来没有这样做过(有一个没有导航属性的fk),但通过研究,我发现了这一点:。如果没有导航属性,您似乎无法拥有外键。