C# 在实体框架中将表单导航属性迁移到外键
我目前有一个带有导航的EF实体,类似于: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
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),但通过研究,我发现了这一点:。如果没有导航属性,您似乎无法拥有外键。