C# 如何更新EF 6中的外键-代码优先-一对多关系

C# 如何更新EF 6中的外键-代码优先-一对多关系,c#,sql-server,entity-framework-6,C#,Sql Server,Entity Framework 6,基于此问题中提供的解决方案:,我可以使用id字段更新外键 但是现在,我从数据库中获取实体时遇到了一个异常。使用此代码: // Retrieve data first using (var db = new TestDbContext()) { var p2 = db.Persons.First(); } 我得到以下SqlException:“无效的列名'Country_Id1'。” 是否有人有任何线索可以检索数据和更新外键? 以另一种方式询问,是否可以同时使用导航属性以方便使用我的实体

基于此问题中提供的解决方案:,我可以使用id字段更新外键

但是现在,我从数据库中获取实体时遇到了一个异常。使用此代码:

// Retrieve data first
using (var db = new TestDbContext())
{
    var p2 = db.Persons.First();
}
我得到以下SqlException:“无效的列名'Country_Id1'。”

是否有人有任何线索可以检索数据和更新外键? 以另一种方式询问,是否可以同时使用导航属性以方便使用我的实体和外键的id来更新我的从属实体

我的实体

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

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

这可能是因为实体框架正试图基于
Person
实体中的导航属性
Country
创建新的外键

我认为您应该用
ForeignKey
属性注释
Country\u Id
属性,如下所示

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    [ForeignKey("Country_Id")]
    public virtual Country Country { get; set; }
    public int Country_Id { get; set; }
}
但是,如果按照以下命名属性的ef命名约定进行命名,则不需要对其进行注释

与主主键具有相同数据类型的任何属性 属性,并且名称遵循以下格式之一 表示关系“”或“”的外键

你可以从中读到更多


注意:您可能需要运行数据库迁移或需要重新创建数据库。

确实如此。有点奇怪,如果你没有明确的FK属性,默认(阴影)属性名称按惯例是
Country\u Id
,但是对于明确的FK,它是
CountryId
,正如你提到的:)来完成@IvanStoev奇怪的注释:当使用多对多关系时,默认属性名称是Country\u Id。。。
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual Country Country { get; set; }
    public int CountryId { get; set; }
}