正在从导航属性迁移到实体框架中的外键
本文关键字:框架 实体 导航 属性 迁移 | 更新日期: 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
方法中)。删除这两条涉及外键的行。理想情况下,Up
和Down
方法应该为空。
正如这里与实体框架代码优先讨论的那样,您需要至少有一个导航属性才能使您的关系正常工作。
但是,如果你想保留你的导航属性(为了避免处理迁移),只想在模型中添加一个外键,那么你可以使用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;}
}