【问题标题】:Entity Framework 4.1 code-first KeyAttribute as non-identity column实体框架 4.1 代码优先 KeyAttribute 作为非标识列
【发布时间】:2011-04-28 14:39:21
【问题描述】:

我的代码优先模型有问题。数据现在在数据库中,因此我无法使用 DropCreateDatabaseIfModelChanges 类重新播种数据库,但我需要更改一个表,以便 bigint 列不是 IDENTITY(1,1)。我已经设法使用 SSMS 做到这一点,但现在我的 EF 代码说它已经过时了。 这是相关表格的代码:

public class Vote {
    [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long FacebookUserId { get; set; }
    [Required]
    public Entity Entity { get; set; }
}

所以我改变了我的表架构和我的模型(我认为这是它的反映,但我显然错了),但 EF 仍然说我的模型已经过时,我不能重新播种数据库以使其“完美”。

任何帮助将不胜感激。

谢谢,

本杰明

【问题讨论】:

    标签: entity-framework entity-framework-4.1 azure-sql-database


    【解决方案1】:

    使用数据注释:

    public class Customer
    {
    [Key]
    
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CustomerID { get; set; }
    }
    

    使用流畅的 API:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Customer>().Property(c => c.CustomerID).HasDatabaseGeneratedOption(null);
        base.OnModelCreating(modelBuilder);
    }
    

    【讨论】:

      【解决方案2】:

      参考this post...

      似乎实体框架默认情况下希望您插入到标识列中。

      解决这个尝试

          modelBuilder.Entity<BOB>()
          .HasKey(p => p.Id)
              .Property(p => p.Id)
                  .StoreGeneratedPattern = StoreGeneratedPattern.None;
      
      builder.Entity<BOB>().MapSingleType().ToTable("BOB");
      

      或者用 ... 装饰你在 POCO 中的钥匙

       [Key]
       [DatabaseGenerated(DatabaseGeneratedOption.None)]
       public Int64 PolicyID { get; set; }
      

      【讨论】:

      • 只是为了澄清:应该是[DatabaseGenerated(DatabaseGeneratedOption.None)],而不是[DatabaseGenerated(DatabaseGenerationOption.None)]
      【解决方案3】:

      尝试将此添加到您的OnModelCreating

      modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
      

      这应该消除模型已过期的异常,但在此之前您必须始终手动同步模型和数据库。

      【讨论】:

      • 这消除了错误,但现在我得到一个新的错误,因为我在表中映射了“实体”,它告诉我只允许原始类型。我是否需要在某个时候重新播种数据库,如果需要,我该如何在不破坏数据的情况下做到这一点? (如果第一部分的答案是肯定的,我会提出一个新问题)
      • 您在代码中究竟做了哪些更改。我以为您只添加了 DatabaseGenerated 属性,但这抱怨未映射的实体。您无需重新播种 DB。
      • 单独的表,没有任何改变,也只是重新播种,仍然出现此错误。
      • 单独的表不同,然后更改一个表,以便 bigint 不是身份。
      • 对不起,我的意思是实体被映射了。我最终不得不将我的数据备份到第二个数据库,使用 DropCreateDatabaseIfModelChanges 策略重新生成模型,然后将数据移植回来。感谢您的所有帮助:-)
      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 2012-03-12
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多