簡體   English   中英

EntityFramework正在刪除我在dbcontext創建上的記錄

[英]EntityFramework is deleting my records on dbcontext creation

在.NET Core項目中,我有以下模型:

public class WrapperContext : DbContext
{
    public DbSet<WrappedFunction> Functions { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder builder)
    {
        builder.UseSqlite("Data Source=functions.db");
    }
}

public class WrappedFunction
{
    [Key]
    public int FunctionId { get; set; }
    public String FunctionName { get; set; }
    public String AssemblyPath { get; set; }
    public String FactoryName { get; set; }
}

如您所見,它是一個Sqlite數據庫。

我添加了初始遷移並更新了數據庫。 在運行我的測試應用程序之前,我已使用單個記錄填充了Functions表。 我可以用SqliteManager打開數據庫,看看記錄在那里。

然后我嘗試使用以下函數訪問DB:

    static MUinfo getInfoFor(String command)
    {
        UFInfo rv = null;

        using (var ctx = new WrapperContext())  // <---- record disappears here
        {
            foreach (var fn in ctx.Functions)
            {
                if (fn.FunctionName.Equals(command))
                {
                    rv = new UFInfo()
                    {
                        AssemblyPath = fn.AssemblyPath,
                        FactoryName = fn.FactoryName,
                        CommandName = command
                    };
                }
            }
        }

        if (rv != null) return rv;
        return "No Info for " + command;
    }

但是,當單步執行調試器時,我發現foreach循環從不執行,因為DB中沒有記錄。 當我在執行foreach之前停止時,我可以驗證(使用SqliteManager)我的單個記錄已從數據庫中刪除。

因此,似乎DbContext對象以某種方式從數據庫中刪除數據。 為什么會這樣,我在這里做錯了什么? 我對EntityFramework相當新,所以我可能做了一些明顯的事情,但這對我來說並不明顯。

這里還有一點信息。 執行db訪問的項目是一個庫項目。 在填充並運行應用程序之前,我必須將數據庫復制到應用程序的構建目錄。 我不知道這是否有所作為。

編輯6/19/17(18:51):

好。 更多信息(感謝@StevePy)。 Nunit3似乎與EFCore沖突(雖然我沒有在恢復時遇到任何錯誤)所以我無法為此創建單元測試。 所以我在上面的清單中插入了一個using (var ctx...)並插入了幾個虛擬記錄。 然后我退出使用塊,當我進入一個遍歷記錄他們在那里。

然而,我然后評論了虛擬插入並重新進行了測試。 而且, 兩個記錄再一次消失了。 因此,EFCore有一些非常奇怪的事情。

編輯6/20/17(15:30):嗯,我仍然不確定發生了什么,但EFCore和Microsoft.Data.Sqlite之間存在奇怪的交互。

我決定刪除對EFCore的所有引用,並簡單地在DB上使用SQL查詢。 我沒有重新創建數據庫就這樣做了(所以我使用的是EFCore已創建的數據庫)。 當我在不使用EFCore的情況下創建新的SqliteConnection時,我注意到了完全相同的行為。

無奈之下,我刪除了數據庫,並使用Microsoft.Data.Sqlite從頭開始重新創建它。 顯然,該DB沒有任何EFCore信息。 然后我用數據庫填充了一些測試記錄並開始使用它。 沒有更多的消失記錄。

顯然,EFCore首先設置數據庫的方式非常奇怪,導致了這個問題。 但我不知道它是什么。

可能發生的是您正在使用CodeFirst / w EF,但在測試新代碼時采用DB第一種方法。 EF跟蹤數據庫中的模式更改,我的猜測是,通過提前創建表,它不知道模式已經過審查,因此它會在上下文啟動時丟棄並重新創建。

這里的修復應該是創建一個“存根”測試,使用您的EF模型填充測試記錄一次。 從那里你應該有一個EF表識別該上下文並接受的表。 從那里,您可以在任何編輯器中創建測試記錄以進行測試。

SQLite在模式遷移方面有一些限制,您可能也需要考慮這些限制。 (參見: https//docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations

您可能最好先設置數據庫,告訴EF如何映射到現有的SQLite模式,而不是嘗試使用Code-First,因為遷移對於該數據庫引擎來說非常有限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM