我想在Visual Studio C#项目中创建我的第一个数据库并将实体添加到此数据库。我还没有设法做到这一点。在尝试时,我会在DbContext
上致电SaveChanges()
时获得DbUpdateException
。代码优先在实体框架保存时抛出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; }
}
我现在用的是以下方面:
public class Library : DbContext
{
/// <summary>
/// Constructor using the base constructor.
/// This constructor names the database "Library".
/// </summary>
public Library() : base("Library")
{
}
/// <summary>
/// Set of TVSeriesReferences stored in the database.
/// </summary>
public DbSet<TVSeriesReference> TVSeriesReferences { get; set; }
/// <summary>
/// Set of SeasonReferences stored in the database.
/// </summary>
public DbSet<SeasonReference> SeasonReferences { get; set; }
/// <summary>
/// Set of EpisodeReferences stored in the database.
/// </summary>
public DbSet<EpisodeReference> EpisodeReferences { get; set; }
}
这是我如何尝试创建并将实体保存到da tabase。
using (var db = new Library())
{
var reference = new TVSeriesReference
{
Id = 2,
TheTVDBId = 1,
IsWatched = true
};
db.TVSeriesReferences.Add(reference);
try
{
db.SaveChanges();
}
catch (DbUpdateException e)
{
Debug.WriteLine("\n\n*** {0}\n\n", e.InnerException);
}
}
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并通过该实体框架。
有没有人可以帮我把这个工作?
UPDATE:在app.config
<connectionStrings>
<add name="Library"
connectionString="Data Source=.\SQLEXPRESS"
providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>
那么这个例外很明显是说数据库中没有'dbo.TVSeriesReferences'对象(我相信这是你试图更新的地方)。 – tpeczek
但是不是实体框架应该创建数据库以及必要的表?如果不是,你能告诉我应该如何创建?我们的目标是在本地存储数据,并且只能在这个应用程序中使用(这不是必需的,但我相信这将是最简单的)。 – simonbs
在此代码之前,您是否已初始化数据库? – IronMan84