我遇到了代码优先模型的问题。数据现在在数据库中,因此我不能使用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仍然说我的模型已经过时了,我不能重新种子数据库,让它“完美”。
非常感谢任何帮助。
谢谢,
本杰明
答案 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>();
这应该删除模型已过期的异常,但在此之前,您必须始终手动同步模型和数据库。