【问题标题】:Entity Framework not inserting record实体框架不插入记录
【发布时间】:2016-08-09 05:06:39
【问题描述】:

我正在 WPF 中开发一个小项目,您可以在其中插入、编辑和搜索食谱。我正在为此使用实体。

Recipe 有一个属性,list<Ingredient>。当我插入一个成分时,没关系,但是当我插入一个带有list<Ingredient> 的食谱时,一切都很好,除了在表食谱中,根本没有列成分。但是在调试中我清楚地可以看到,在我插入食谱的方法中,对象食谱有成分计数......我花了几个小时尝试不同的东西,但没有运气。

这就是我插入的方式(与成分相同,一切正常)

public static void InsertRecipe(Recipe recipe)
{
    RecipeDbContext ctx = new RecipeDbContext();
    ctx.Recipes.Add(recipe);
    ctx.SaveChanges();
}    

调试截图:

Recipe Table

Recipe object properties

仅出于测试目的,成分应稍后来自列表框。 当我按 ctrl 时,属性菜单正在消失(屏幕截图的原因)

【问题讨论】:

  • 我们需要更多细节。你有什么例外吗?使用 SQL Profiler 查看插入查询。
  • 没有任何例外,除了成分列表之外,所有内容都被很好地插入,它甚至没有为它创建一个列......我有一个用于配方和成分的 DbSet 列表。我不知道“SQL Profiler”,我想试试这是什么。
  • 我已经检查了 SQL Profiler,我不能去尝试所有这些,因为这将花费我比提交这个项目更多的时间。我必须在明天给它。不过,我可以为您提供更多详细信息、屏幕截图或您需要的任何内容。
  • 您正在尝试使用列表插入对象?你能把你的代码给我吗,我不清楚
  • 是的,就是这样,我编辑了我上面的帖子。对象配方有一个属性 List ,所以我以这种方式填充该列表,设置其他属性值,然后插入配方。

标签: c# wpf database entity-framework


【解决方案1】:

整个 User Instance 和 AttachDbFileName= 方法是有缺陷的 - 充其量!在 Visual Studio 中运行您的应用程序时,它将复制 .mdf 文件(从您的 App_Data 目录到输出目录 - 通常是 .\bin\debug - 您的应用程序运行的位置)并且很可能 ,您的 INSERT 工作正常 - 但您最终只是查看了错误的 .mdf 文件

如果您想坚持使用这种方法,请尝试在 myConnection.Close() 调用上设置断点 - 然后使用 SQL Server Mgmt Studio Express 检查 .mdf 文件 - 我几乎可以肯定您的数据在那里。

在我看来,真正的解决方案

  1. 安装 SQL Server Express(反正你已经完成了)

  2. 安装 SQL Server Management Studio Express

  3. SSMS Express中创建你的数据库,给它一个逻辑名称(例如RecipeDataBase

  4. 使用它的逻辑数据库名称(在服务器上创建它时给出)连接到它——不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:

    Data Source=.\\SQLEXPRESS;Database=RecipeDataBase;Integrated Security=True
    

    其他一切都一模一样和以前一样......

有关更多背景信息,另请参阅 Aaron Bertrand 的优秀博文 Bad habits to kick: using AttachDbFileName

【讨论】:

    【解决方案2】:

    首先,您必须插入Recipe item并获取ID:

    public static int InsertRecipe(Recipe recipe)
                {
                    RecipeDbContext ctx = new RecipeDbContext();
                    ctx.Recipes.Add(recipe);
                    ctx.SaveChanges();
                    return recipe.recipeID;
                }
    

    然后你可以插入所有的成分,类似的东西

    public static void InsertIngredient(List<Ingredient> Ingredients, int recipeID)
            {
                IngredientDbContext ctx = new IngredientDbContext();
    
                foreach (var ingredient in Ingredients)
                {
                    Ingredient newItem = new Ingredient { IngredientID = ingredient.Ingredient,..., recipeID = recipeID};
                    ctx.Ingredient.Add(newItem);
                }
                ctx.SaveChanges();
            }
    

    【讨论】:

    • 好吧,我现在明白了,谢谢你向我解释。我无法到达成分。Recipe.recipeID ...说成分不包含recipeID的定义...我是这样沮丧,因为这应该是一件简单的事情,我不知道如何实现这一点。
    • @marc_s,感谢您抽出宝贵时间,这是正确的数据库,我可以看到其中的每条新记录,问题是从配方具有的所有属性中,它插入除了成分(列表)。所以我认为 Amine 解释的应该这样做,只是不知道该怎么做......至于你的步骤,1 和 2 我已经有了,所以我从现在开始尝试这种方法,我在学校现在这就是 mdf 足够的原因。我明白有像你这样更好/更稳定的替代品。谢谢!
    猜你喜欢
    • 2015-04-19
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    相关资源
    最近更新 更多