实体框架的 Code First 在保存时抛出 DbUpdateException

2024-02-05

我正在尝试在 Visual Studio C# 项目中创建我的第一个数据库,并向该数据库添加一个实体。我还没有做到这一点。当尝试时,我会得到一个DbUpdateException打电话时SaveChanges() on the DbContext.

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

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; }
}

这就是我尝试创建实体并将其保存到数据库的方式。

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>

使用实体框架时代码优先您仍然需要在您的中设置正确的 ConnectionStringapp.config文件。例如如果你想在文件中有一个本地数据库,你可以使用嵌入式SQL Server CE 4数据库引擎(当然代码优先可与许多不同的数据库一起使用,包括 SQL Server、SQL Server Express 和 MySQL):

<connectionStrings> 
    <add name="Library" connectionString="Data Source=|DataDirectory|CodeFirst.sdf" providerName="System.Data.SqlServerCe.4.0"/> 
</connectionStrings>

在运行时,DataDirectory替换字符串将替换为应用程序当前执行环境的适当目录路径。如果没有DataDirectory替换字符串,您的应用程序必须根据当前执行环境以编程方式确定数据库文件的位置,然后动态构建连接字符串中使用的路径。

The 代码优先还有一个由初始化策略控制的自动重新创建功能。默认的初始化策略是如果不存在则创建数据库 http://msdn.microsoft.com/en-us/library/gg679221%28v=vs.103%29.aspx。如果您的 ConnectionString 指向不存在的数据库,则使用此策略代码优先将为您创建数据库,但如果数据库已经存在代码优先不会尝试创建它。

初始化策略可以改变Database.SetInitializer()方法为以下之一:

  • 始终删除创建数据库 http://msdn.microsoft.com/en-us/library/gg679506%28v=vs.103%29.aspx
  • 如果模型更改则删除创建数据库 http://msdn.microsoft.com/en-us/library/gg679604%28v=vs.103%29.aspx
  • 将数据库迁移到最新版本 http://msdn.microsoft.com/en-us/library/hh829293%28v=vs.103%29.aspx

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架的 Code First 在保存时抛出 DbUpdateException 的相关文章

随机推荐