【问题标题】:Eager loading with cascading comboboxes使用级联组合框进行急切加载
【发布时间】:2014-03-26 05:16:59
【问题描述】:

我有一个实体框架应用程序,其中客户和项目之间存在一对多关系。在级联组合框中访问数据。我最初使用延迟加载并且一切正常。由于我现在必须序列化我的数据,我需要以另一种方式加载我的数据。我想使用急切加载,但我不确定如何在我的情况下实现它。在 Projects 属性中,我尝试使用以下内容进行访问:

 var a = context.Customers.Include("Project");
            projects = (ObservableCollection<Project>)a;

但出现转换类型错误。有人对我访问产品数据有什么建议吗?谢谢。

public class ViewModel:INotifyPropertyChanged
{
    RevisionModelContainer context = new RevisionModelContainer();

    public ViewModel()
    {
        Customers = new ObservableCollection<Customer>();            
    }
 private ObservableCollection<Customer> customers;
    public ObservableCollection<Customer> Customers
    {
        get 
        {         
            return customers;            
        }            
        set
        {
            customers = value;
            OnPropertyChanged("Customers");               
        }
    }

    private ObservableCollection<Project> projects;
    public ObservableCollection<Project> Projects 
    {
        get
        {
            var a = context.Customers.Include("Project");
            projects = (ObservableCollection<Project>)a;
            return projects;             
        }
        set
        {
            projects = value;
            OnPropertyChanged("Projects");
        }
    }

 private Customer selectedCustomer;
    public Customer SelectedCustomer
    {
        get { return selectedCustomer; }
        set
        {
            try
            {
                selectedCustomer = value;
                OnPropertyChanged("SelectedCustomer");
                this.Projects = selectedCustomer.Projects;
                OnPropertyChanged("Projects");
            }
            catch (Exception ex) 
            {
                Debug.WriteLine("Seleceted Customer: " + ex.Message);
            }
        }
    }

    private Project selectedProject;
    public Project SelectedProject
    {
        get { return selectedProject; }
        set
        {
            try
            {
                selectedProject = value;
                OnPropertyChanged("SelectedProject");
                this.Programs = selectedProject.Programs;
                OnPropertyChanged("Programs");
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Selected Project: " + ex.Message);
            }
        }
    }

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您的“项目”和“客户”属性应分别为IEnumerable&lt;Project&gt;IEnumerable&lt;Customer&gt; 类型。您不需要将任何内容强制转换为 ObservableCollection。唯一需要使用 ObservableCollections 的时候是视图需要对集合的 content 变化做出反应。在您的情况下,视图只需要知道 Projects 属性 value 更改为不同的项目列表。

    这就是我的意思:

    public class ViewModel : INotifyPropertyChanged
    {
        RevisionModelContainer context = new RevisionModelContainer();
    
        public ViewModel() 
        {
            Customers = context.Customers.Include("Project");
        }
    
        public IEnumerable<Customer> Customers { get; private set; }
    
        public IEnumerable<Project> Projects { get; private set; }
    
        private Customer selectedCustomer;
        public Customer SelectedCustomer
        {
            get 
            { 
                return selectedCustomer; 
            }
            set
            {
                selectedCustomer = value;
                OnPropertyChanged("SelectedCustomer");
    
                // reset the projects.
                this.SelectedProject = null;
                this.Projects = selectedCustomer.Projects;
                OnPropertyChanged("Projects");
            }
        }
    
        private Project selectedProject;
        public Project SelectedProject
        {
            get 
            { 
                return selectedProject; 
            }
            set
            {
                selectedProject = value;
                OnPropertyChanged("SelectedProject");
            }
        }
    }
    

    根据我对您的用例的了解,这应该可行。如果您在视图模型中从客户、项目或程序集合中动态添加删除项,您只需要可观察的集合,如下所示:Projects.Add(new Project());

    如果您所做的只是分配像 Projects = SelectedCustomer.Projects 这样的属性,则无需使用可观察集合,您只需为更新的属性引发 propertychanged 事件。

    【讨论】:

    • 我相信他们确实需要做出反应。根据选择的客户,有不同的项目。
    • 我在回复中添加了更多细节——我认为我最初的意思并不那么清楚。
    • 我实际上是在动态添加和删除集合中的项目。抱歉,我之前没有提到。我不知道它会与我的问题冲突。
    • 好的,我可以更新答案以反映此信息,但我认为这不是您想要的。甚至无法将selectedCustomer.Projects 转换为ObservableCollection&lt;Project&gt;INotifyCollectionChanged。您需要创建一个新的可观察集合并在其中转储 selectedCustomer.Projects 的内容,这意味着您的添加/删除不会反映在实际的实体集合中。
    • selectedCustomer.Projects 可能是EntityCollection&lt;Project&gt; 类型,EntityCollection&lt;T&gt; 看起来像这样:EntityCollection&lt;TEntity&gt; : RelatedEnd, ICollection&lt;TEntity&gt;, Enumerable&lt;TEntity&gt;, IEnumerable, IListSource where TEntity : class
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多