![](/img/trans.png)
[英]Entity Framework throws exception - Invalid object name 'dbo.BaseCs'
[英]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; }
}
}
參考
LibraryReservationSystem數據庫已經是現有數據庫。 它沒有桌子。 我期待EF創建表格。
那不對。 如果數據庫存在,則EF不會在此數據庫中創建任何表。 如果數據庫不存在,EF可以創建數據庫。 這是默認數據庫初始化程序CreateDatabaseIfNotExists
,如果您沒有顯式更改它,它將被應用。 您可以選擇另外兩個初始值設定項: DropCreateDatabaseAlways
或DropCreateDatabaseIfModelChanges
。 但是這些都不會在現有數據庫中創建表,而是完全刪除數據庫並從頭開始創建包括所有表。
你能做什么:
DropCreateDatabaseAlways
初始化程序一次讓EF創建包含表的數據庫,然后再次刪除初始化程序 Seed
方法中編寫SQL代碼,將表格添加到數據庫中
@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.