gpt4 book ai didi

c# - 在SQL Server 2012中使用Entity Framework 5时出错

转载 作者:太空宇宙 更新时间:2023-11-03 16:08:17 25 4
gpt4 key购买 nike

我正在使用Visual Studio 2012 Web发布功能将ASP.MVC 4.0应用程序部署到具有IIS 7.5的Windows Server 2008 R2。
该应用程序面向.NET 4.5,并使用EntityFramework 5.0 Code First进行数据访问。目标dabatase是SQL Server 2012的实例。

在服务器中,我已经在SQL Server 2012上手动创建了数据库和用户(一个dbo,另一个仅具有读/写权限),但没有填充数据库。我想使用dbo用户使用EF迁移。

在我的开发工作站中,一切与以LocalDb为目标的数据库都能正常工作,因此我假设上下文和映射是正确的。

但是,当我将应用程序部署到服务器并尝试运行它时,我不断收到以下异常:

System.Data.Entity.ModelConfiguration.ModelValidationException: One or more validation errors were detected during model generation:
System.Data.Entity.Edm.EdmEntityType : EntityType "Entity" has no key defined. Define the key for this EntityType.


对上下文的每个实体重复“ EntityType没有定义的键”。

我已经检查了web.config并按预期部署了连接字符串。

数据库的初始化发生在Application_Start中:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Poip.Web.Domain.Migrations.Configuration>());
using (var context = new MyContext())
context.Database.Initialize(true);


我的情况很简单,就像我的实体一样。然后,我使用EntityTypeConfiguration类进行配置,然后将其加载到上下文的OnModelCreating方法中。如前所述,它可以与LocalDb(或SqlCompact)一起使用。实体示例:

public class UserFile
{
public int UserFileKey { get; set; }

// TODO: Utilizar este campo para verificar integridade do arquivo
public string Hash { get; set; }

public string FilePath { get; set; }

public string OriginalFileName { get; set; }

public Guid Guid { get; set; }

public long Size { get; set; }

public int UserKey { get; set; }
public UserProfile User { get; set; }

public UserFile()
{
this.Guid = Guid.NewGuid();
}
}


internal class UserFileMap : EntityTypeConfiguration<UserFile>
{
public UserFileMap()
{
this.HasKey(e => e.UserFileKey);
this.Property(e => e.UserFileKey)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

this.Property(e => e.FilePath)
.IsRequired()
.HasMaxLength(255);

this.HasRequired(e => e.User)
.WithMany()
.HasForeignKey(e => e.UserKey);
}
}


我的上下文简化了:

public class MyContext : DbContext
{
public MyContext()
{
this.Configuration.LazyLoadingEnabled = false;
}

public DbSet<UserFile> UserFiles { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<StoreGeneratedIdentityKeyConvention>();

modelBuilder.LoadConfigurations();
}

}


LoadConfigurations是一种加载程序集的所有EntityTypeConfiguration类的方法。它已经在其他应用程序中经过测试,并且再次可以在我的开发工作站上运行。

我尝试完全放弃迁移。我使用迁移来生成脚本。我从脚本中删除了“ __MigrationHistory”表,并在服务器上执行了该表以创建表。然后我将初始化更改为:

Database.SetInitializer<MyContext>(null);
using (var context = new MyContext())
context.Database.Initialize(true);


但是我继续遇到同样的例外。

我不知道接下来要检查什么。任何帮助,将不胜感激。

编辑

LoadConfigurations方法:

public static void LoadConfigurations(this DbModelBuilder builder)
{
LoadConfigurations(builder, Assembly.GetCallingAssembly());
}
public static void LoadConfigurations(this DbModelBuilder builder, Assembly assembly)
{

var configurationTypes = assembly.GetTypes()
.Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));

foreach (dynamic configuration in configurationTypes.Select(type => Activator.CreateInstance(type)))
{
builder.Configurations.Add(configuration);
}
}


更新

我做了一些测试:


我已经在本地运行该应用程序,“调试”配置,定位到LocalDb并使用了Migrations。该应用程序正常工作。 .mdf文件已创建,表也已创建。
我已经将应用程序发布到服务器上,进行了“调试”配置,定位到LocalDb并使用了Migrations。我有以下黄色的死亡画面:

[Win32Exception(0x80004005):系统找不到指定的文件]

[SqlException(0x80131904):建立与SQL Server的连接时发生与网络相关或特定于实例的错误

我相信仅安装Sql Server 2012不支持LocalDb。
我已使用迁移功能将应用程序发布到服务器的“发布”配置中,以SQL Server 2012数据库为目标。数据库已经创建,为空,指定的用户为dbo。错误:

在模型生成期间检测到一个或多个验证错误:
\ tSystem.Data.Entity.Edm.EdmEntityType::EntityType'UserFile'没有定义键。定义此EntityType的键。
[每个实体的重复]
\ tSystem.Data.Entity.Edm.EdmEntitySet:EntityType:EntitySet'UserFiles'基于未定义键的'UserProfile'类型。
[每个实体的重复
我已经 generated a Script using Migration,将其发送到服务器,然后在数据库上手动执行它。我将该应用程序发布到服务器上,并以“ SQL Server 2012”为目标并使用Migrations(作为数据库初始化程序)进行了“发布”配置。同样的错误。
我创建了一个小的ConsoleApplication,它引用了我的数据访问库。它唯一要做的就是用与Web应用程序相同的方式初始化上下文(将Database.SetInitializer设置为使用迁移并创建上下文)。我已经将其发送到服务器并执行了。它运行没有问题!在数据库中正确创建了表,并且不会引发任何异常。


似乎我的Web应用程序坏了。我必须找到哪里。

它令人沮丧。为什么无法识别我的模型?我还使用NLog来检查OnModelCreating是否已命中和是否命中。我相信,如果没有找到元数据信息(我认为存储在“ __MigrationHistory”表中), the context should trust my database

最佳答案

听起来好像您在某处缺少主键。

确保您的实体具有密钥,确保它是“属性”(具有获取/设置),并且它是“公共”。

最后,尝试右键单击模型,然后选择“从数据库更新模型”

链接:


How to fix System.Data.Edm.EdmEntityType has no key
http://forums.asp.net/t/1809295.aspx/1

关于c# - 在SQL Server 2012中使用Entity Framework 5时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18471421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com