Ped*_*ree 32 .net c# entity-framework entity-framework-5
我有这个错误消息,每次运行应用程序时都会继续显示.我正在使用实体Framework 5: Code First
这是错误信息,
System.NotSupportedException: Model compatibility cannot be checked because the database does not contain model metadata. Model compatibility can only be checked for databases created using Code First or Code First Migrations.
at System.Data.Entity.Internal.ModelCompatibilityChecker.CompatibleWithModel(InternalContext internalContext, ModelHashCalculator modelHashCalculator, Boolean throwIfNoMetadata)
at System.Data.Entity.Internal.InternalContext.CompatibleWithModel(Boolean throwIfNoMetadata)
at System.Data.Entity.Database.CompatibleWithModel(Boolean throwIfNoMetadata)
at System.Data.Entity.DropCreateDatabaseIfModelChanges`1.InitializeDatabase(TContext context)
at System.Data.Entity.Database.<>c__DisplayClass2`1.<SetInitializerInternal>b__0(DbContext c)
at System.Data.Entity.Internal.InternalContext.<>c__DisplayClass8.<PerformDatabaseInitialization>b__6()
at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
at System.Data.Entity.Internal.InternalContext.Initialize()
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
at System.Data.Entity.DbSet`1.Add(TEntity entity)
at LaundryService_DEMO.frmMain.btnCreate_Click(Object sender, EventArgs e) in d:\MyDocs\Visual Studio 2012\Projects\LaundryService_DEMO\LaundryService_DEMO\frmMain.cs:line 39
Run Code Online (Sandbox Code Playgroud)
当我创建一个名为invoice的实体时,会启动此错误.这是实体的完整代码,
public class Invoice
{
public string InvoiceID { get; set; }
public string CustomerID { get; set; }
public string UserID { get; set; }
public decimal TotalAmount { get; set; }
public DateTime TransactionDate { get; set; }
public DateTime PaymentDate { get; set; }
public Customer CustomerField { get; set; }
public SystemUser SystemUserField { get; set; }
}
public class InvoiceMap : EntityTypeConfiguration<Invoice>
{
public InvoiceMap()
{
// Primary Key
this.HasKey(x => x.InvoiceID);
// Property(ies) and Mapping(s)
this.ToTable("Invoice");
this.Property(x => x.InvoiceID)
.IsRequired()
.HasMaxLength(15)
.HasColumnName("InvoiceID")
.HasColumnType("nVarchar");
this.Property(x => x.CustomerID)
.IsRequired()
.HasMaxLength(15)
.HasColumnName("CustomerID")
.HasColumnType("nVarchar");
this.Property(x => x.UserID)
.IsRequired()
.HasMaxLength(15)
.HasColumnName("UserID")
.HasColumnType("nVarchar");
this.Property(x => x.TotalAmount)
.IsRequired()
.HasColumnName("TotalAmount")
.HasColumnType("decimal");
this.Property(x => x.TransactionDate)
.IsRequired()
.HasColumnName("TransactionDate")
.HasColumnType("datetime");
this.Property(x => x.PaymentDate)
.IsOptional()
.HasColumnName("PaymentDate")
.HasColumnType("datetime");
// Relationship
this.HasRequired(x => x.CustomerField)
.WithMany(x => x.InvoiceCollection)
.HasForeignKey(y => y.CustomerID);
this.HasRequired(x => x.SystemUserField)
.WithMany(x => x.InvoiceCollection)
.HasForeignKey(y => y.UserID);
}
}
Run Code Online (Sandbox Code Playgroud)
为了复制应用程序,我已经包含了可供下载的项目文件.所以这个问题不会充满代码.
如果我在问题中遗漏了详细信息,请发表评论,以便我可以加入.
Ped*_*ree 55
我通过改变找到了代码
static LaundryShopContext()
{
Database.SetInitializer<LaundryShopContext>(
new DropCreateDatabaseIfModelChanges<LaundryShopContext>());
}
Run Code Online (Sandbox Code Playgroud)
成
static LaundryShopContext()
{
Database.SetInitializer<LaundryShopContext>(
new DropCreateDatabaseAlways<LaundryShopContext>());
}
Run Code Online (Sandbox Code Playgroud)
Jud*_*udo 14
这可能与您的数据库不包含_MigrationHistory表(可以使用表>系统表中的SQL Server Management Studio查看)有关.
不确定您是如何管理数据库的,但如果您仍处于开发阶段并使用EF迁移,则快速解决方案是删除数据库并运行Update-Database,它将重新创建整个数据库并添加_MigrationHistory表.
如果要避免EF运行此检查,可以将其添加到DbContext类中
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
Run Code Online (Sandbox Code Playgroud)
Jas*_*lle 11
如果像我一样,这是由Code First开始并在项目中改为Database First开发引起的......这一切都是由一条简单的线引起的.如果您需要将数据库及其数据注释掉以下行:
Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
Run Code Online (Sandbox Code Playgroud)
来自模型的这一部分.
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
static ApplicationDbContext()
{
// Set the database intializer which is run once during application start
// This seeds the database with admin user credentials and admin role
// Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
Run Code Online (Sandbox Code Playgroud)
在使用内置身份模型开始时,这通常会发生.一旦让它们工作,您可以删除该行以保持其完整性但保留功能.但是,如果您的模型发生了变化,您的数据库必须配置为匹配..无论如何,您在Database First开发中正在做的事情!
Sta*_*ark 10
如果您尝试针对先前存在的同名数据库初始化上下文,但该数据库是使用其他代码库创建的,则也会发生这种情况.这就是为什么从DropCreateDatabaseIfModelChanges更改为DropCreateDatabaseAlways的原因,后一种配置会导致无论如何重新创建数据库,从而绕过可能导致此问题的任何类型的数据库版本控制.
我知道我迟到了,但我刚刚遇到了同样的错误,并且我的数据库已经有一个迁移历史记录表。
该错误还可能表明历史表中的上下文键不正确。如果您将数据库上下文类移动到另一个命名空间,就像我在重构时所做的那样,可能会发生这种情况。
ContextKey
将表中的值更新MigrationHistory
为数据库上下文的新命名空间解决了我的问题。
此解决方案不需要您丢弃数据库内容,因此可能优于该DropCreateDatabaseAlways
解决方案。
归档时间: |
|
查看次数: |
48358 次 |
最近记录: |