C# EF模型生成问题
我添加了一个类并创建了一个迁移,但是当我更新数据库时,我得到了一个错误。这让我很困惑,因为我确实有钥匙!有什么想法吗 在模型生成过程中检测到一个或多个验证错误: ModuleStatus::EntityType“ModuleStatus”没有 键已定义。定义此EntityType的键。模块状态: EntityType:EntitySet“ModuleStatus”基于类型“ModuleStatus” 没有定义键的 班级C# EF模型生成问题,c#,entity-framework,C#,Entity Framework,我添加了一个类并创建了一个迁移,但是当我更新数据库时,我得到了一个错误。这让我很困惑,因为我确实有钥匙!有什么想法吗 在模型生成过程中检测到一个或多个验证错误: ModuleStatus::EntityType“ModuleStatus”没有 键已定义。定义此EntityType的键。模块状态: EntityType:EntitySet“ModuleStatus”基于类型“ModuleStatus” 没有定义键的 班级 public class ModuleStatus { [Key]
public class ModuleStatus
{
[Key]
public int ModuleStatusId { get; set; }
public Guid ModuleId { get; set; }
[StringLength(100)]
public string NetworkAddress { get; set; }
[StringLength(100)]
public string ModuleName { get; set; }
[StringLength(100)]
public string ModuleDescription { get; set; }
[StringLength(50)]
public string ModuleVersion { get; set; }
public TimeSpan UpTime { get; set; }
public DateTime LastUpdated { get; set; }
}
迁移过程如下所示
public override void Up()
{
CreateTable(
"dbo.ModuleStatus",
c => new
{
ModuleStatusId = c.Int(nullable: false, identity: true),
ModuleId = c.Guid(nullable: false),
NetworkAddress = c.String(maxLength: 100),
ModuleName = c.String(maxLength: 100),
ModuleDescription = c.String(maxLength: 100),
ModuleVersion = c.String(maxLength: 50),
UpTime = c.Time(nullable: false, precision: 7),
LastUpdated = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.ModuleStatusId);
}
堆栈跟踪:
ModuleStatus::EntityType“ModuleStatus”未定义键。定义
此EntityType的键。ModuleStatus:EntityType:EntitySet
“ModuleStatus”基于没有键的类型“ModuleStatus”
定义
位于System.Data.Entity.Core.Metadata.Edm.EdmModel.Validate()处
System.Data.Entity.DbModelBuilder.Build(DbProviderManifest
providerManifest,数据库providerInfo providerInfo)位于
System.Data.Entity.DbModelBuilder.Build(DbConnection
提供程序连接)位于
System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext
(上下文)在
System.Data.Entity.Internal.RetryLazy2.GetValue(TInput输入)位于
System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
在
System.Data.Entity.Internal.InternalContext.ForceSpaceLoadingForknownEntityTypes()
在
System.Data.Entity.DbContext.System.Data.Entity.Infrastructure.IOObjectContextAdapter.get_ObjectContext()
位于e:\App中的---.----DataContext..ctor()
开发\瞪羚-
EstateManager\CI-MAIN\------Context.cs:line
28
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()位于
System.Data.Entity.Infrastructure.DbContextInfo.CreateInstance()位于
System.Data.Entity.Infrastructure.DbContextInfo..ctor(类型
contextType、DbProviderInfo模型ProviderInfo、AppConfig配置、,
DbConnectionInfo connectionInfo,Func
1解析器)位于
System.Data.Entity.Migrations.Dbmigator..ctor(Dbmigrations配置
配置,DbContext usersContext,DatabaseExistenceEstate
ExistenceEstate,布尔值,在
System.Data.Entity.Migrations.Dbmigator..ctor(Dbmigrations配置
配置)在
System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.GetMigrator()
在
System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
在System.AppDomain.DoCallBack(CrossAppDomainDelegate
callBackDelegate)在
System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)位于System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner 跑步者)在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串 targetMigration,布尔力)在 System.Data.Entity.Migrations.UpdateDatabaseCommand.c_uuDisplayClass2.b_uuu0() 在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(操作 指挥部) 更新2 结果表明,只有当我的
DataContext中有这一行时,它才会失败
public IDbSet<Site> Sites { get; set; } // works fine with this in
//public IDbSet<ModuleStatus> ModuleStatuses { get; set; } // fails if this is commented in
公共IDbSet站点{get;set;}//在
//公共IDbSet ModuleStatuses{get;set;}//如果在中对此进行了注释,则会失败
将其放入DbContext类可能值得一试:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ModuleStatus>().HasKey(x = x.ModuleStatusId);
base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasKey(x=x.ModuleStatusId);
基于模型创建(modelBuilder);
}
不确定这是否有用,但值得一试。克里斯,请参考以下链接:
可能会发生冲突或歧义。[Key]注释有些冗余,因为重写的Up()方法已经定义了主键。尝试删除[Key]注释,并告知我们这是否解决了问题。您是否使用
System.Data.Entity.dll
而不是EntityFramework.dll
?据我所知,使用EntityFramework.dll
)您实际上不需要添加[Key]
属性,如果属性名是Id
或[ClassName]Id
,尽管如果“额外”属性是原因,我会非常惊讶。。。你的迁移看起来像什么?用我的迁移更新了这个问题。。。我们的数据库中有许多实体,我以前从未见过这个问题。你是对的,虽然它看起来是正确的,但我不认为是什么导致了这个,也许是一个非典型字段导致了这个。如果删除GUID和Timespan字段,迁移是否有效?