2017-06-06 115 views
1

基于此问题中提供的解决方案:How to update foreign key in EF 6 - Code First,我可以使用id字段更新我的外键。如何更新EF 6中的外键 - 代码优先 - 一对多关系

但是现在,我从数据库中获取实体时发生异常。使用此代码:

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

回答

2

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

我想你应该注释Country_Id财产与ForeignKey属性如下。

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

但是,如果按照下面的命名属性的命名约定,则不需要对其进行注释。

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

你可以阅读更多从here

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

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

+0

确实。有点奇怪,如果你没有明确的FK属性,按照惯例默认的(shadow)属性名称是'Country_Id',但是对于显式的FK,它是'CountryId',正如你所提到的:) –

+0

@IvanStoev感谢您纠正我。 –

+2

要完成@IvanStoev奇怪的评论:当使用多对多关系时,默认的属性名是Country_Id ... – nmariot