为什么我们需要声明一个属性才能将外键属性放入相同的名称?

时间:2019-01-16 10:57:24

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

如果我必须在参考导航属性上声明一个前瞻性的键名,为什么还要创建一个原始类型,即User_ID?

例如

    public class Sims
    {
        public int ID { get; set; }

        public int Users_ID { get; set; }
        [ForeignKey("Users_ID")]
        public Users Users { get; set; }
    }

为什么我需要public int Users_ID { get; set; }才能在用户上仅放置外键属性?

2 个答案:

答案 0 :(得分:1)

因为这告诉EF用来存储链接的“用户”记录的ID的外键 field 被命名为“ Users_ID”。
如果您不需要显式地在Sims实体中使用该字段,则可以将其完全省略,并且根本不需要使用ForeignKey属性,并且EF会为您管理该字段场景。

或者,您可以将外键字段命名为“ UsersId”,并且由于约定,它将假定这是外键。

因此,其中任何一项都应该完全没问题:

//no explicit foreign key
public class Sims
{
    public int ID { get; set; }
    public Users Users { get; set; }
}

//explicit foreign key but EF works it out via convention
public class Sims
{
    public int ID { get; set; }
    public int UsersId { get; set; }
    public Users Users { get; set; }
}

//explicitly named foreign key which is named differently from 
//convention so needs to be pointed at.  note nameof() operator
//which will give a compiler error should you rename it, so is
//better than a magic string
public class Sims
{
    public int ID { get; set; }

    [ForeignKey(nameof(Users))]
    public int MyUsersFkField { get; set; }        
    public Users Users { get; set; }
}

您还可以将属性添加到Users属性中,并将其指向ID字段。

一个重要的注意事项是,如果您使用非常规命名的FK属性,并且完全不指定外键,则EF会在以下位置创建FK UsersId字段:基础数据库并使用该数据库(但这不会在您的模型中公开)

答案 1 :(得分:0)

[ForeignKey]属性将覆盖外键的默认约定。它使我们能够在名称与主体实体的主键属性不匹配的从属实体中指定外键属性。

在您的情况下,这将在Sims表中创建名为Users_ID的外键列,从而防止在数据库中生成ID列。