【问题标题】:How to update foreign key in EF 6 - Code First - One to many relationship如何在 EF 6 中更新外键 - 代码优先 - 一对多关系
【发布时间】:2017-06-06 16:46:39
【问题描述】:

根据此问题中提供的解决方案:How to update foreign key in EF 6 - Code First,我可以使用 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; }
}

【问题讨论】:

    标签: c# sql-server entity-framework-6


    【解决方案1】:

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

    我认为您应该使用ForeignKey 属性注释Country_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 命名约定,则不需要对其进行注释。

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

    您可以从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; }
    }
    

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

    【讨论】:

    • 确实如此。有点奇怪,如果您没有显式 FK 属性,则默认(阴影)属性名称按照约定是 Country_Id,但对于显式 FK,它是 CountryId,正如您提到的 :)
    • 完成@IvanStoev 奇怪的评论:当使用多对多关系时,默认属性名称是 Country_Id ...
    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2012-03-06
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多