【问题标题】:Using Entity Framework Code First CTP5, how do I create a primary key column that are INTs and are not identity columns使用 Entity Framework Code First CTP5,我如何创建一个主键列,它是 INT,而不是标识列
【发布时间】:2011-06-27 08:34:18
【问题描述】:

使用Entity Framework Code First CTP5,我如何创建一个主键列是INT而不是标识列

最好不要使用属性。

【问题讨论】:

    标签: entity-framework code-first entity-framework-ctp5


    【解决方案1】:

    那个答案对我不起作用(在 EF 4.1 中)。

    为了完成这项工作,我在我的键列中添加了 DatabaseGenerated 属性:

    public class FacebookUser
    {
      [Key]
      [DatabaseGenerated(DatabaseGeneratedOption.None)]
      public long FacebookId { get; set; }
    
      // ...
    }
    

    希望这对某人有所帮助。

    【讨论】:

    • 工作了一次,并且获得了将架构声明保留在类声明中的好处,而不是在通用构建方法中的某个地方移出。恕我直言,让它更容易被发现。
    • 我不知道为什么这行得通,但@MattHamilton 的流畅 API 答案没有,但确实如此。谢谢:)
    • 只是添加这个东西在迁移的情况下不起作用,你必须删除并创建数据库,然后它既适用于流利的情况,也适用于注释的情况
    • 对于 .Net Framework,它位于 System.ComponentModel.DataAnnotations.Schema 命名空间中。
    【解决方案2】:

    如果您使用 fluent 接口而不是在属性上使用属性来构建实体,则可以使用 DatabaseGenerationOption 类(来自 System.ComponentModel.DataAnnotations 命名空间中的 EntityFramework.dll)。我还没有测试过它,但这就是它的样子:

    modelBuilder
        .Entity<Foo>()
        .Property(f => f.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    

    【讨论】:

    • 我讨厌这个 API 选择,所以我在 PrimitivePropertyConfiguration .Identity(isIdentity:false) 和 .Computed() 上编写了这些扩展方法
    【解决方案3】:

    小改变

    public class User
    {
    
      [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    
      public int ID { get; set; }
    
      // Rest of the code
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-09
      • 2017-04-15
      • 1970-01-01
      • 2011-06-15
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多