を私はナビゲーションプロパティが取得する以下のコードIブランチを使用して支店内の項目をロードしようとするたびに、私はナビゲーションプロパティはロードされません - EF
public class Items
{
public int Id { get; set; }
public string Barcode { get; set; }
public string Name { get; set; }
public int SizeId { get; set; }
public int Price { get; set; }
public int DiscountId { get; set; }
public int ShortageMargin { get; set; }
[NotMapped]
public double ActualPrice
{
get
{
double amount = ((double)Price * (double)Discount.Amount/100);
double price = (Price - amount < 0) ? 0 : Price - amount;
return price;
}
}
public Discounts Discount { get; set; }
public ItemSizes Size { get; set; }
public ICollection<ItemsInBranches> ItemsInBrach { get; set; }
}
public class Branches
{
public int Id { get; set; }
public string Name { get; set; }
public string Location { get; set; }
public ICollection<Employees> Employees { get; set; }
public ICollection<TransactionLog> TransacionLogs { get; set; }
public ICollection<ItemsInBranches> ItemsInBranch { get; set; }
}
public class ItemsInBranches
{
public int Id { get; set; }
public int ItemId { get; set; }
public int BranchId { get; set; }
public int Amount { get; set; }
[NotMapped]
public bool IsShort
{
get
{
return Amount < Item.ShortageMargin;
}
}
public Items Item { get; set; }
public Branches Branch { get; set; }
}
を次のように定義された3つのモデルのアイテム、枝とItemsInBranchesを抱えていますうまくロードされたが、私のアイテムは常に
public IEnumerable<StorageViewModel> GetStorage(int? BranchId)
{
var storage = Find(x => true).Select(s => new StorageViewModel
{
Amount = s.Amount,
BranchName = s.Branch.Name,
ItemName = s.Item.Name,
SortageMargin = s.Item.ShortageMargin,
IsShort = s.IsShort
});
return storage;
}
public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
return _dataContext.Set<TEntity>().Where(predicate);
}
私はアイテムIDとBranchIdは、データベース内のアイテムや支店のテーブルの外部キーに設定されていることを確認しましたがnullに設定されている、彼らはNULLを許可していないと、彼らは強制します外部キー制約 cou私が教えてくれるのは、なぜアイテムが常にnullに設定されている間にブランチだけがロードされるのかです。
万一、簡潔にするためにコンストラクタコードを削除しますか? –
ItemNameとSortageMarginがnullであることを意味しますか? – Evk
現時点では、それぞれの「ItemsInBranches」のデータベースから関連エンティティ(ブランチ、アイテム)を別々にフェッチするために、遅延ロードに頼っています。両方のプロパティは 'virtual'ではないので、' Branch'はロードされているように見えますし、 'Item'はロードしないことに驚いていません。しかし、投影を両方とも有効にして有用にする(つまり、データの量を制限する)ために、 'Find'から' IQueryable'を返すべきです。後で 'IsShort'を扱う –