Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架的代码首先在保存时抛出DbUpdateException_C#_Database_Visual Studio 2010_Entity Framework - Fatal编程技术网

C# 使用实体框架的代码首先在保存时抛出DbUpdateException

C# 使用实体框架的代码首先在保存时抛出DbUpdateException,c#,database,visual-studio-2010,entity-framework,C#,Database,Visual Studio 2010,Entity Framework,我正试图在Visual Studio C#项目中创建我的第一个数据库,并向该数据库添加一个实体。我还没有做到这一点。尝试时,在DbContext上调用SaveChanges()时,我将得到一个DbUpdateException 我正在尝试保存以下实体: public class TVSeriesReference : Reference { } TVSeriesReference除了继承Reference: public class Reference { /// <summar

我正试图在Visual Studio C#项目中创建我的第一个数据库,并向该数据库添加一个实体。我还没有做到这一点。尝试时,在
DbContext
上调用
SaveChanges()
时,我将得到一个
DbUpdateException

我正在尝试保存以下实体:

public class TVSeriesReference : Reference
{
}
TVSeriesReference
除了继承
Reference

public class Reference
{
    /// <summary>
    /// ID of the reference.
    /// </summary>
    public int Id { get; set;  }

    /// <summary>
    /// Reference to the element in theTVDB.
    /// </summary>
    public int TheTVDBId { get; set; }

    /// <summary>
    /// Whether or not the reference has been marked as watched.
    /// </summary>
    public bool IsWatched { get; set; }
}
db.SaveChanges()
将引发以下异常:

System.Data.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Invalid object name 'dbo.TVSeriesReferences'.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
   at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
   --- End of inner exception stack trace ---
   at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
   at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
   at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
我已经把头发撕了好几个小时了,我不知道我做错了什么。似乎没有创建表(或者整个数据库?)。 在这之前,我是否应该设置或安装一些东西?我已经安装了NuGet,并通过它安装了实体框架

有人能帮我把这件事做好吗

更新:app.config中的连接字符串


您需要设置数据库初始值设定项,然后初始化数据库。由于这是一个新的数据库,可能最好的开始是DropCreateDatabaseAlways。您可以执行以下操作:

Database.SetInitializer(new DropCreateDatabaseAlways<Library>());
using(var db = new Library())
{
  db.Database.Initialize(true);
}
Database.SetInitializer(新的DropCreateDatabaseAlways());
使用(var db=new Library())
{
db.Database.Initialize(true);
}

像@tpeczek所说的那样,在App.config中放置一个连接字符串也是一个好主意。

首先处理实体框架代码时,您仍然需要在App.config文件中设置正确的连接字符串。例如,如果您想在文件中包含本地数据库,可以使用嵌入式SQL Server CE 4数据库引擎(当然,代码优先可以用于许多不同的数据库,包括SQL Server、SQL Server Express和MySQL):


. 使用此策略,如果您的ConnectionString指向不存在的数据库,则首先代码将为您创建数据库,但如果数据库已存在,则首先代码不会尝试创建它

可以使用
Database.SetInitializer()
方法将初始化策略更改为以下选项之一:

Database.SetInitializer(new DropCreateDatabaseAlways<Library>());
using(var db = new Library())
{
  db.Database.Initialize(true);
}

这里您需要记住,重新创建数据库将导致丢失存储在其中的所有数据。

很明显,例外情况是数据库中没有“dbo.TVSeriesReferences”对象(我相信这就是您尝试进行更新的地方)但是实体框架不应该创建数据库和必要的表吗?如果没有,你能告诉我应该如何创建这个吗?我们的目标是将数据存储在本地,并且它应该只对这个应用程序可用(虽然这不是一个要求,但我相信这将是最简单的)。在编写这段代码之前,您是否初始化了数据库?这取决于具体情况。如果已在现有数据库中设置连接字符串,则EF code first不会尝试自动创建连接字符串。那么你的连接字符串是什么?@IronMan84否。我已经学习了关于这个主题的各种教程,我不相信他们中有人提到过任何关于初始化数据库的内容。你能详细说明一下怎么做吗?我刚刚尝试添加
db.Database.Initialize(true)
的开头使用(var db=new Library()){…}
块,它似乎没有做任何事情。EF设置CreateDatabaseIfNotExists的默认初始值设定项。您不需要设置初始值设定项,除非您想更改它。即使如此,最好还是考虑使用迁移。
Database.SetInitializer(new DropCreateDatabaseAlways<Library>());
using(var db = new Library())
{
  db.Database.Initialize(true);
}
<connectionStrings> 
    <add name="Library" connectionString="Data Source=|DataDirectory|CodeFirst.sdf" providerName="System.Data.SqlServerCe.4.0"/> 
</connectionStrings>