3

我正在尝试在 Visual Studio C# 项目中创建我的第一个数据库并向该数据库添加一个实体。我还没有做到这一点。尝试时,我会在DbUpdateException调用.SaveChanges()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 并通过它安装了实体框架。

有没有人可以帮助我让它工作?

更新:连接字符串在app.config

<connectionStrings>
    <add name="Library"
         connectionString="Data Source=.\SQLEXPRESS"
         providerName="System.Data.SqlServerCe.4.0"/>
  </connectionStrings>
4

2 回答 2

2

在使用 Entity Framework Code First时,您仍然需要在app.config文件中设置正确的 ConnectionString。例如,如果你想在文件中有一个本地数据库,你可以使用嵌入式 SQL Server CE 4 数据库引擎(当然Code First可以与许多不同的数据库一起使用,包括 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替换字符串,您的应用程序将不得不根据当前执行环境以编程方式确定数据库文件的位置,然后动态构建连接字符串中使用的路径。

Code First还具有由初始化策略控制的自动重新创建功能。默认初始化策略是CreateDatabaseIfNotExists。使用此策略,如果您的 ConnectionString 指向的数据库不存在,Code First将为您创建数据库,但如果数据库已经存在,Code First将不会尝试创建它。

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

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

于 2012-10-19T17:23:20.920 回答
0

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

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

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

于 2012-10-19T13:52:55.820 回答