【问题标题】:Why do we need to declare a property in order to put Foreign Key attribute with the same name? [duplicate]为什么我们需要声明一个属性才能放置同名的外键属性? [复制]
【发布时间】:2019-01-16 10:57:24
【问题描述】:

如果我必须在引用导航属性上声明一个外键名称,为什么我们需要创建一个原始类型,即 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; } 才能在Users 上仅放置一个外键属性?

【问题讨论】:

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


    【解决方案1】:

    因为这告诉 EF 用于存储链接的“用户”记录的 id 的外键 字段被命名为“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 字段并使用它(但这不会在您的模型中公开)

    【讨论】:

    • 简而言之,如果我只在 sims 中声明 Userid,那么它将在 sims 表中创建一个外键列,对吗?再说一次,如果我可以为属性命名任何我喜欢的名称,那么为什么外键属性只会给你自己命名的好处呢?
    • 没有。仅声明一个名为 UserId 的 int 属性 不会 创建外键。只有当您有一个指向User 表的导航属性 时,它才会这样做。如果您添加此导航属性没有外键ID字段,则外键字段本身将在数据库中,但将直接在代码中可用 - 例如thisSim.Users.Id 会得到你的 id,但 thisSim.UserId 不会编译。
    • 哦,如果您问“有什么意义?”,那么您是对的 - 对于首先使用代码的新构建,您永远不需要像这样指定外键。当您开发 EF 模型以与预先存在的数据库一起使用时,这真正很有用。我有一个数据库,其中主键(因此这些表的外键)几乎普遍是VARCHAR 字段,并且(通常)命名为NameCode。这些属性允许我正确地指定实体之间的关系,所以对我来说非常有用。
    • @GPW 我正在寻找此评论而不是答案。
    【解决方案2】:

    [ForeignKey] 属性覆盖了外键的默认约定。它允许我们在名称与主体实体的主键属性不匹配的依赖实体中指定外键属性。

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

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2012-10-01
      相关资源
      最近更新 更多