EntityFramework CodeFirst 数据库不更新

Posted

技术标签:

【中文标题】EntityFramework CodeFirst 数据库不更新【英文标题】:EntityFramework CodeFirst Database doesn't update 【发布时间】:2012-10-07 13:07:55 【问题描述】:

一天前,我开始在简单的 Windows 窗体项目 (C#) 中使用实体框架 CodeFirst。我创建了两个模型:

[Table("SavesSet")]
public partial class Saves

    public Saves()
    
        this.SkillsSet = new HashSet<Skills>();
    

    [Key]
    public int SaveID  get; set; 

    public string Player  get; set; 
    public int Age  get; set; 
    public int Money  get; set; 

    public virtual ICollection<Skills> SkillsSet  get; set; 


[Table("SkillsSet")]
public partial class Skills

    [Key]
    public int SkillID  get; set; 

    public string Name  get; set; 
    public int Value  get; set; 
    public int SavesSaveID  get; set; 

    public virtual Saves SavesSet  get; set; 

然后我使用 Visual Studio 数据库资源管理器(使用 SqlServerCe 3.5 的本地数据库)在我的数据库中添加了一行:

保存ID = 1

播放器 =“测试”

年龄 = 1

金钱 = 1

我还用 ListView 创建了表单并写了一些代码:

private SavesContext db = new SavesContext();
foreach (Saves s in db.SavesSet.ToList())

    ListViewItem l = new ListViewItem();
    l.Name = s.SaveID.ToString();
    l.Text = s.Player;
    ListViewSaves.Items.Add(l);

但是当我开始程序调试时,ListView 是空的。我设置了断点,查看了局部变量,发现 SavesSet 计数为 0。

我通过代码添加了一行:

Saves s = new Saves();
s.Player = "TestName";
s.Age = 5110;
s.Money = 200;
db.SavesSet.Add(s);
db.SaveChanges();

ListView 显示了这个。但是在我的数据库中什么都没有(而且它的大小没有改变)。我重新启动了 Visual Studio - 我的问题仍然存在:ListView 显示项目,但数据库为空。我在 App.Config 和 VS Database Explorer 中检查了 ConnectionString - 它们是相等的。

所以,我的问题是:如何探索我的真实数据库以及它存储在哪里?

更新。

我的 DbContext:

    public SavesContext()
        : base("Saves")
    
    

    public DbSet<Saves> SavesSet  get; set; 
    public DbSet<Skills> SkillsSet  get; set; 

还有我的 App.Config:

<?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
        </configSections>
        <connectionStrings>
            <add name="TextSim.Properties.Settings.Saves" connectionString="Data          
            Source=C:\Documents and Settings\My\My Documents\visual studio       
            2010\Projects\TextSim\TextSim\Saves.sdf"
            providerName="System.Data.SqlServerCe.3.5" />
        </connectionStrings>
     </configuration>

【问题讨论】:

断开它并重新连接(右键单击数据库) 感谢您的评论,但我已经尝试过很多次了。它不工作。 你能告诉我们你的连接字符串吗? 我尝试了两个 ConnectionStrings - 它们都不起作用:“Data Source=|DataDiretory|/Saves.sdf”和“Data Source=C:\Documents and Settings\My\My Documents\visual studio 2010\Projects\TextSim\TextSim\Saves.sdf". 我很惊讶它甚至可以工作,因为您的连接字符串的命名与您配置的不同。您的 dbcontext 应该是 base("name=TextSim.Properties.Settings.Saves") 【参考方案1】:

实体框架使用一种称为约定优于配置的东西,这意味着如果您不为某些事物提供值,它会使用默认值。

如果您不指定连接字符串,它将使用从您的 EF 命名空间和 DbContext 名称派生的默认连接字符串。如果是这种情况,那么它将使用默认系统创建一个新的(空白)数据库,而不是使用您在 Web.Config 中配置的那个。

因此,当您保存内容时,它确实会保存到错误的数据库。

【讨论】:

嗯。我将 App.Config 中的 ConnectionString 从“Data Source=|DataDirectory|/Saves.sdf”更改为“Data Source=C:\Documents and Settings\My\My Documents\visual studio 2010\Projects\TextSim\TextSim\Saves。自卫队”。并且程序不显示来自真实基础的值 - 它显示了我从代码创建的行。

以上是关于EntityFramework CodeFirst 数据库不更新的主要内容,如果未能解决你的问题,请参考以下文章

Entityframework Codefirst模式自动生成数据库方式

EntityFramework CodeFirst 数据库不更新

第三篇:Entity Framework CodeFirst & Model 映射 续篇 EntityFramework Power Tools 工具使用

如何使用 EntityFramework 4.1 CodeFirst 防止十进制值在保存时被截断为 2 位? [复制]

关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析

entityframework学习笔记--005-给code first一个正确的解释