簡體   English   中英

在SQL Server 2012中使用Entity Framework 5時出錯

[英]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”表中), 則上下文應信任我的數據庫

聽起來好像您在某處缺少主鍵。

確保您的實體具有密鑰,確保它是“屬性”(具有獲取/設置),並且它是“公共”。

最后,嘗試右鍵單擊模型,然后選擇“從數據庫更新模型”

鏈接:

最后!

出於某種感覺,我檢查了應用程序的AppPool設置,並將“啟用32位應用程序”從“ false”更改為“ true”,並且Web應用程序能夠訪問數據庫。

我不知道為什么,但是我會嘗試找出答案。

UPDATE

顯然,我不是第一個使用EntityFramework + Windows Server 2008 R2 64位+ IIS 7.5和“啟用32位”選項發現錯誤的人:

這里 這里

但是,在他們的情況下,症狀有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM