簡體   English   中英

實體框架異常:無效的對象名稱

[英]Entity Framework Exception: Invalid object name

我正在嘗試使用Code First方法創建數據庫。 當我運行以下代碼時,我收到以下異常。 我定義的字段有什么問題嗎? 我們怎樣才能克服這一點?

例外

更新條目時發生錯誤。 有關詳細信息,請參閱內部異常

內在例外

“無效的對象名稱'dbo.Dinners'。

注意 :我在數據庫中沒有這樣的表(Dinners)。 該代碼應該創建表。 我只是給了連接字符串來識別EF Code First中提到的服務器:無法連接到SQL Server 我應該更改連接字符串嗎?

連接字符串:

string connectionstring =“Data Source = .; Initial Catalog = LibraryReservationSystem; Integrated Security = True; Connect Timeout = 30”;

LibraryReservationSystem數據庫已經是現有數據庫。 它沒有桌子。 我期待EF創建表格。

我從一個正在運行的LINQ 2 SQL應用程序復制的連接字符串。 我是否需要對其進行任何更改才能提供給EF?

在此輸入圖像描述

UPDATE

當我包含以下代碼時,異常發生了變化。 現在它說 - “無效的對象名稱'dbo.Dinner'。”。 現在正在抱怨餐桌; 不是晚餐表。

    protected override void OnModelCreating(DbModelBuilder modelbuilder)
    {
        modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }

原始代碼

    static void Main(string[] args)
    {

        string connectionstring = "Data Source=.;Initial Catalog=LibraryReservationSystem;Integrated Security=True;Connect Timeout=30";

        using (var db = new NerdDinners(connectionstring))
        {
            var product = new Dinner { DinnerID = 1, Title = 101 };
            db.Dinners.Add(product);
            int recordsAffected = db.SaveChanges();
        }

    }


using System.Data.Entity;
namespace LijosEF
{
public class Dinner
{
    public int DinnerID { get; set; }
    public int Title { get; set; }

}

public class RSVP
{
    public int RSVPID { get; set; }
    public int DinnerID { get; set; }

    public virtual Dinner Dinner { get; set; }
}

//System.Data.Entity.DbContext is from EntityFramework.dll
public class NerdDinners : System.Data.Entity.DbContext
{

    public NerdDinners(string connString): base(connString)
    { 

    }

    public DbSet<Dinner> Dinners { get; set; }
    public DbSet<RSVP> RSVPs { get; set; }
}
}

參考

  1. http://nerddinner.codeplex.com/discussions/358197
  2. 實體框架 - 無效的對象名稱
  3. 從生成的表中檢索數據時,對象名稱“dbo.TableName”無效
  4. http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-code-first-walkthrough.aspx

LibraryReservationSystem數據庫已經是現有數據庫。 它沒有桌子。 我期待EF創建表格。

那不對。 如果數據庫存在,則EF不會在此數據庫中創建任何表。 如果數據庫不存在,EF可以創建數據庫。 這是默認數據庫初始化程序CreateDatabaseIfNotExists ,如果您沒有顯式更改它,它將被應用。 您可以選擇另外兩個初始值設定項: DropCreateDatabaseAlwaysDropCreateDatabaseIfModelChanges 但是這些都不會在現有數據庫中創建表,而是完全刪除數據庫並從頭開始創建包括所有表。

你能做什么:

  • 手動刪除數據庫(例如在SSMS中),然后EF將創建一個包含表的新數據庫
  • 或者使用DropCreateDatabaseAlways初始化程序一次讓EF創建包含表的數據庫,然后再次刪除初始化程序
  • 或者,如果由於某種原因無法刪除數據庫,請在 Seed方法中編寫SQL代碼,將表格添加到數據庫中 (錯誤,感謝Mark Stafford的評論)
  • 或者,在添加新實體時,使用代碼優先遷移 (EF> = 4.3)將新表添加到現有數據庫。

@Slauma的答案是正確的 - 表是在初始化時創建的。 刪除數據庫並讓EF創建它可能是最簡單的(如果你保持連接字符串不變,它將在本地機器上創建一個名為LibraryReservationSystem的數據庫;如果你要使用它,你應該指定一個顯式的主機名此時配置中的連接字符串)。

你需要的東西是:

public class NerdDinnersInitializer : DropCreateDatabaseIfModelChanges<NerdDinners> { }

您還需要在Main方法中設置初始值設定項:

Database.SetInitializer(new NerdDinnersInitializer());

明智的話:永遠不要像上面那樣使用初始化程序部署應用程序。 您可以在此博客文章中看到如何通過配置文件控制初始化程序,以獲取有關如何在生產應用程序中控制此操作的更多詳細信息。

我剛剛遇到了同樣的問題 - 我已經在我們網絡中需要SQL身份驗證的開發SQL框中創建了我的數據庫。

當我運行我的應用程序時,沒有創建表。 我發現了這篇關於創建Code First數據庫初始化策略的非常簡單的文章,該策略首先檢查數據庫是否存在,然后針對數據庫運行腳本來創建表。

正如文章中所述 - 注意當部署這樣的策略時,無論何時應用程序重新開始,都將重新創建所有數據庫表! 這個策略應該只運行一次。

但你已經知道了。

如錯誤所示,您的數據庫中沒有名為Dinners的表。

您使用單個或多個表名嗎? 即晚餐或晚餐?

據我所知,您期望代碼根據您的實體描述自動創建數據庫。 但除非您明確創建DB,否則不會發生這種情況。 請查看以下鏈接http://www.simple-talk.com/dotnet/.net-framework/entity-framework-4460---learn-to-create-databases-from-the-model/和本教程EF codefirst: http ://codefirst.codeplex.com/

設置實體后,可以右鍵單擊EDMX文件的工作區,然后選擇“從模型生成數據庫...”。 單擊直到您的窗口中有腳本。 對於該腳本,您將不得不刪除數據庫創建步驟(如果存在)並直接進入CREATE TABLE ...

復制 - 粘貼並執行您所擁有的任何數據庫。 您可能必須調整特定RDBMS的腳本。

暫無
暫無

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

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