![](/img/trans.png)
[英]Using Entity framework with SQL Server 2012 (local *.mdf database)
[英]Error using Entity Framework 5 with SQL Server 2012
我正在使用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);
}
}
UPDATE
我做了一些測試:
我已經在本地運行該應用程序,“調試”配置,定位到LocalDb並使用了Migrations。 該應用程序正常工作。 .mdf文件已創建,表也已創建。
我已經將該應用程序發布到服務器上,即“調試”配置,目標是LocalDb並使用“遷移”。 我有以下黃色的死亡畫面:
[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'類型。 [每個實體的重復
我已經使用Migration生成了一個腳本 ,將其發送到服務器,然后在數據庫上手動執行它。 我將該應用程序發布到服務器上,並以“ SQL Server 2012”為目標並使用Migrations(作為數據庫初始化程序)進行了“發布”配置。 同樣的錯誤。
我創建了一個小的ConsoleApplication,它引用了我的數據訪問庫。 它唯一要做的就是用與Web應用程序相同的方式初始化上下文 (將Database.SetInitializer設置為使用遷移並創建上下文)。 我已經將其發送到服務器並執行了。 它運行沒有問題! 這些表已在數據庫中正確創建,並且不會引發異常 。
似乎我的Web應用程序壞了。 我必須找到哪里。
它令人沮喪。 為什么無法識別我的模型? 我還使用NLog來檢查OnModelCreating是否已命中和是否命中。 我認為,如果未找到元數據信息(我認為存儲在“ __MigrationHistory”表中), 則上下文應信任我的數據庫 。
聽起來好像您在某處缺少主鍵。
確保您的實體具有密鑰,確保它是“屬性”(具有獲取/設置),並且它是“公共”。
最后,嘗試右鍵單擊模型,然后選擇“從數據庫更新模型”
鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.