如何使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。

如何使EntityFramework 6.1支持筛选和类似双向绑定的适配器.填充(表格)即可

编辑:更好地解释
上下文集上的本地属性是一个可观察的集合。

在这种情况下,通用存储库模式会有帮助吗?

是的,这是这种情况下的常见模式
因此,使用一个通用的Repository<T>模式
使用类似的方法

 public ObservableCollection<TPoco> Local {
        get { return Context.Set<TPoco>().Local; }
    }

这使您可以访问相关POCO的上下文加载对象。

使用常规方法在访问本地对象之前进行填充。

同时查看Context.Configuration.AutoDetectChangesEnabled = <bool>;

尝试一个简单的测试用例,其中加载一些对象。然后通过本地属性访问对象,进行简单的更改或2和CCD_ 3。

然后尝试绑定集合。