如何使EntityFramework 6.1支持筛选和类似双向绑定的适配器.填充(表格)即可
本文关键字:适配器 绑定 填充 即可 表格 EntityFramework 何使 支持 筛选 | 更新日期: 2023-09-27 18:25:40
我正在尝试让EntityFramework 6.1.1返回一个ObserveableCollection或一个IEnumerable,它支持WinForm中的筛选、排序和绑定(双向)。我一点也不关心实体是什么格式,只要它是可绑定的,并且支持筛选和排序。我猜怎么适配器。填充(表)起作用,但仅使用EntityFramwork作为主干。如果已尝试返回_context.Orders.Local.ToBindingList();但是关联的OrderDetails实体是不可排序的,我也不能对它们进行筛选。如果我将Where表达式附加到Orders,它会将其转换为IEnumerable,并且我不能过滤它们,现在也不能编辑它们。在这种情况下,通用存储库模式会有帮助吗?如果是,请用代码示例回答好吗?
这是我的简化订单类别:
public class Orders
{
public Orders()
{
Details = new HashSet<OrderDetails>();
}
[Key]
public int OrderId {get; set}
public int CustomerId {get; set;}
public decimal OrderTotal { get; set;}
public DateTime OrderDate {get; set;}
public virtual ICollection<OrderDetails> Details {get; set;}
public virtual Customer Customer {get; set;}
}
我有一个ClassLibrary,里面有我尝试过的以下三种方法。如果实体尚未加载,则InitDatabase()方法将加载这些实体。
方法#1:
public static ObservableCollection<ZSA_TransactionDetail> GetAllDetailsAsObservableCollection()
{
InitDatabase();
return NContext.ZSA_TransactionDetail.Local;
}
方法#2:
public static ICollection<ZSA_TransactionDetail> GetAllDetailsAsICollection(int orderNumber = 1022)
{
InitDatabase();
ICollection<ZSA_TransactionDetail> iCollection = null;
ObservableCollection<ZSA_TransactionHeader> headers = NContext.ZSA_TransactionHeader.Local;
ZSA_TransactionHeader myHeader = headers.FirstOrDefault(i => i.intTransactionNumber == orderNumber);
if (myHeader != null)
{
iCollection = myHeader.ZSA_TransactionDetail;
}
if (iCollection != null)
Debug.WriteLine("iCollection Record Count was: " + iCollection.Count);
else
Debug.WriteLine("iCollection was null");
return iCollection;
}
方法#3:
public static BindingList<ZSA_TransactionDetail> GetAllDetailsAsBindingList(int orderNumber = -1)
{
InitDatabase();
if (orderNumber != -1 && IsValidTransaction(orderNumber))
{
BindingList<ZSA_TransactionDetail> details = NContext.ZSA_TransactionDetail.Local.ToBindingList();
var myDetails =
details.Where(i => i.intTransactionNumber == orderNumber) as BindingList<ZSA_TransactionDetail>;
if (myDetails != null)
{
Debug.WriteLine("Number of details: " + myDetails.Count);
return myDetails;
}
throw new Exception("Did not find any details");
}
Debug.WriteLine("Not a valid Transaction Number");
return NContext.ZSA_TransactionDetail.Local.ToBindingList();
}
调用方法2:时,我的Form_Load事件如下所示
private void FormPick_Load(object sender, EventArgs e)
{
ICollection<ZSA_TransactionDetail> data = Library.GetAllDetailsAsICollection(_transactionNumber);
PickingBindingSource.RaiseListChangedEvents = true;
PickingBindingSource.DataSource = data;
Debug.WriteLine("Supports Filter: " + PickingBindingSource.SupportsFiltering);
PickingGridView.DataSource = PickingBindingSource;
ApplyFilter();
}
所有三种方法都报告SupportsFiltering为false。
编辑:更好地解释
上下文集上的本地属性是一个可观察的集合。
在这种情况下,通用存储库模式会有帮助吗?
是的,这是这种情况下的常见模式
因此,使用一个通用的Repository<T>
模式
使用类似的方法
public ObservableCollection<TPoco> Local {
get { return Context.Set<TPoco>().Local; }
}
这使您可以访问相关POCO的上下文加载对象。
使用常规方法在访问本地对象之前进行填充。
同时查看Context.Configuration.AutoDetectChangesEnabled = <bool>;
尝试一个简单的测试用例,其中加载一些对象。然后通过本地属性访问对象,进行简单的更改或2和CCD_ 3。
然后尝试绑定集合。