实体框架4.1代码优先将KeyAttribute作为非标识列

时间:2011-04-28 14:39:21

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

我遇到了代码优先模型的问题。数据现在在数据库中,因此我不能使用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仍然说我的模型已经过时了,我不能重新种子数据库,让它“完美”。

非常感谢任何帮助。

谢谢,

本杰明

3 个答案:

答案 0 :(得分:9)

使用数据注释:

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);
}

答案 1 :(得分:4)

指的是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; }

答案 2 :(得分:2)

尝试将此添加到您的OnModelCreating

modelBuilder.Conventions.Remove<IncludeMetadataConvention>();

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