我有一個物件
public partial class FileAttachment
{
public FileAttachment()
{
this.Tags = new HashSet<Tag>();
}
public virtual ICollection<Tag> Tags {get; set;}
...other propertties
}
我的背景關系課程有
public virtual DbSet<FileAttachment> FileAtttachments {get; set;}
public virtual DbSet<Tag> Tags {get; set;}
public virtual DbSet<Item> Items {get; set;}
...
我在我的控制器中使用它
MyContext.Items.AsNoTracking().Where(i => i.ItemId == inputId &&
MyContext.FileAttachments.AsNoTracking.Where(f => f.RecordId == i.ReferenceId && f.RecordType == 'item').Any()).Any();
我得到的錯誤是
'方法'System.Data.Entity.Infrastructure.DbQuery 1[Demo.FileAttachment] AsNoTracking()' declared on type 'System.Data.Entity.Infrastructure.DbQuery1[Demo.FileAttachment]'不能用'System.Data.Entity.Core.Objects.ObjectQuery`1[Demo.FileAttachment]'型別的實體呼叫''
我是 AsNoTracking() 的新手。任何人都可以告訴我哪里做錯了嗎?
uj5u.com熱心網友回復:
看起來實際要求是檢查Item具有特定 ID 的是否具有特定型別的相關 FileAttachment。不需要這樣做AsNoTracking(),因為查詢回傳單個布林值,而不是需要跟蹤的物件。
如果類具有適當的導航屬性,則查詢將很簡單:
var found= MyContext.FileAttachments.Any(f=>f.RecordType == 'item'
&& f.Item.Id = ThatItemID);
沒有它們,LINQ 查詢將不得不加入兩個“不相關”的物體:
var query = from item in MyContext.Items
join person in MyContext.FileAttachmentes
on file.RecordId equals item.ReferenceId
where item.ItemID == ThatId &&
file.RecordType == 'item'
select 1;
var found=query.Any();
缺乏導航屬性是模型錯誤的一個非常強烈的跡象。
DbContext 不是資料庫的模型,也不必鏡像它。也不需要為整個應用程式設定一個DbContext。即使沒有外鍵約束Items,也可以在類之間FileAttachments添加關系
uj5u.com熱心網友回復:
AsNoTracking()用于防止 EF 跟蹤物體。跟蹤允許 EF 跟蹤所做的修改,并且在保存時,可以保留這些更改。所以,如果一個查詢不需要跟蹤(比如一個簡單的 get 查詢,其中沒有資料更改被持久化),我們使用AsNoTracking().
在您的情況下,如果物體相關而不是呼叫,請使用導航屬性Context.Entity。此外,AsNoTracking()在加載資料之前,只需在查詢中指定一次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/515628.html
標籤:C#实体框架林克
