【问题标题】:Entity Framework Code First from database not adding Key attribute来自数据库的实体框架代码优先不添加键属性
【发布时间】:2015-06-10 20:10:16
【问题描述】:

从现有数据库生成代码优先类时,不会将 KeyAttribute 添加到表的主键属性中。

数据库中的所有表都有一个名为 Id 的单列 int PK,没有复合键

表单生成器和其他类通过反射使用此属性进行内部逻辑

我可以配置实体框架在重新生成模型类时将 KeyAttribute 添加到主键属性吗?

我必须通过 MetadataType 属性手动注释所有关键属性并更改我的代码以支持元数据类型?

谢谢

【问题讨论】:

  • 你用什么工具生成代码?
  • 使用visual studio,使用ado.net实体数据模型添加新项目对话框,选择'code first from database'选项
  • 那么它会生成流畅的映射吗? (与以前的 EF 工具相反,它不适用)。
  • 是的,Visual Studio code first 向导生成流畅的映射,但是 HasKey 方法永远不会被调用,它是主键映射方法
  • 很奇怪。您的表真的有主键(不仅仅是唯一索引)吗?

标签: entity-framework attributes ef-code-first primary-key data-annotations


【解决方案1】:

这是正确的行为。请参阅下面来自https://msdn.microsoft.com/en-us/data/gg193958.aspx 的 sn-p。

One of the conventions that code first depends on is how it implies which property is the key in each of the code first classes. That convention is to look for a property named “Id”...

意思是如果你命名你的 pk Id,它将推断 Id 是 pk。

【讨论】:

    【解决方案2】:

    不要将主键列命名为“Id”

    由于某种原因,当列名称为“Id”时,代码不会首先从现有数据库向导添加 Key 属性

    这是使用“Id”列生成的代码:

    [Table("tabla")]
    public partial class tabla
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }
    

    这是通过将“Id”重命名为“llave”生成的代码

    [Table("tabla")]
    public partial class tabla
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int llave { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多