ef 問題彙總

2021-07-25 02:22:25 字數 3538 閱讀 7013

持續更新:

資料庫:username

model: 

[column("username")]

public string username222

資料庫 :

//主表

public partial class maintable

[key]

public int maintableid

[inverseproperty("maintable1")]

public virtual icollectionsubtable1

[inverseproperty("maintable2")]

public virtual icollectionsubtable2

}//從表

public partial class subtable

public nullablemtid1

public nullablemtid2

[foreignkey("mtid1")]

public virtual maintable maintable1

[foreignkey("mtid2")]

public virtual maintable maintable2

}

很常見的是 

在 linq to entities 查詢中無法構造實體或複雜型別

the entity or complex type 'snd.ef.dttree' cannot be constructed in a linq to entities query

var q=db.users.tolist().select(x=>new ***()).tolist()
記得先.tolist,把資料放到記憶體中。而不是讓ef去幫你生成乙個巢狀的複雜sql。(貌似有時不先.tolist()可以,有時不可以。這個沒深究)

在查詢時,使用asnotracking()

錯誤 : 支援「entities」上下文的模型已在資料庫建立後發生更改。請考慮使用 code first 遷移更新資料庫(

我出現這個錯誤的原因是,我對資料庫進行了修改,而實體層沒有修改。當我採用code first更新的時候,就報錯了。

解決方法:

到資料庫,點開系統表,找到  __migrationhistory  刪除即可

public partial class model

public bool ischecked

[foreignkey("listid")]

public virtual submodel sub

}

不建議使用如下**

//這樣容易造成資源已釋放的錯誤!

using (dbcontext db = new dbcontext())

//我們應該直接

dbcontext db = new dbcontext()

使用 newtonsoft 序列化 帶有外來鍵的實體層時,很容易報錯(類似於死迴圈的乙個錯誤)。

錯誤的本身很簡單,是說你的關聯物件有乙個 foreignkey,所以他去序列化關聯物件了。結果在關聯物件裡,又發現了你的主鍵物件(主外來鍵關係,一定在2個類中會存在的)。結果又回到主鍵物件反序列化,結果又發現了外來鍵物件。如此反覆。所以報錯了。

解決方法比較簡單:在屬性上增加 [jsonignore] 屬性。不過這也會導致從此以後,他再也不會  被序列化  以及  反序列化

public partial class model

[jsonignore]

public virtual submodel sub

}

資料庫連線字串,增加以下    multipleactiveresultsets=true;

1 可能資料庫不存在這個列

解決:增加資料庫字段

2 newtonsoft.json的問題,不要使用9.00以上版本,存在bug(樓主自己遇見過,不吹不黑,換成6.0.0版本就好了,巨坑!!!)

解決:通過nuget 解除安裝所有newtonsoft.json。然後刪除所有類庫下的packages.config,最後手動新增6.0.0版本引用

在建立 dbcontext時 ,設定  

_ncontext.configuration.proxycreationenabled = false;
請詳細看一下問題,在試試如下方法

資料庫不存在時重新建立資料庫:

database.setinitializer(new createdatabaseifnotexists());
每次啟動應用程式時建立資料庫:

database.setinitializer(new dropcreatedatabasealways());
模型更改時重新建立資料庫:

database.setinitializer(new dropcreatedatabaseifmodelchanges());
從不建立資料庫:

database.setinitializer(null);
十五 , 表名複數問題

protected override void onmodelcreating(dbmodelbuilder modelbuilder)

十六,列名 discriminator 無效

詳見:在查詢物件以及關聯物件時。出現的這個問題。

解決方案:

1 資料庫可能沒有關聯id

2 如果你是這麼建立物件的話

在關聯物件上,指定foreignkey(指向屬性名)

public partial class wd_myproject

public int uid

[foreignkey("uid")]

public virtual wd_employee wd_employee

}

可以嘗試反過來:

在屬性上,指定foreignkey(關聯物件名)

public partial class wd_myproject

[foreignkey("wd_employee")]

public int uid

public virtual wd_employee wd_employee

}

ps :  

這兩種方法都是正確的(foreignkey中的引數指向不同)。但是我在專案中就是遇到了使用第二種才能正常執行的情況。

msdn上是這麼說的:

EF載入問題

如本系統中任何乙個物件都會有乙個建立人物件對應資料庫id是 createuserid 舉例 實體 sysaccount 我們為了在頁面上顯示建立人姓名,那麼我們給這個實體加乙個 public virtual sysaccount createuser 的擴充套件屬性 那麼在對應的 sysaccoun...

EF 一些概念彙總

ef 必須要了解的一些 關鍵字含義 virtual 導航屬性 屬性注釋與fluent api iqueryable ienumable 延遲載入 懶載入 include 貪婪載入 變數捕獲 ef使用sql語句 以及使用儲存過程 解釋 導航屬性 其實就是 對錶與表之間的關係進行說明 誰是誰的從表vir...

EF6 Oracle問題總結

ef6 oracle問題總結 1 未能從程式集oracle.manageddataaccess中載入型別oracleinternal.common.configbaseclass,在伺服器上安裝過多個版本的oracle。導致gac中oracle.manageddataaccess.dll版本和在程式...