实体框架和ICollection

本文关键字:ICollection 框架 实体 | 更新日期: 2023-09-27 18:11:11

背景

我正在学习WPF(主要是为了好玩(,正在构建一个小应用程序来使用。

我创建了一个SQL Server数据库(仅限表(,然后使用实体框架(EF("数据库中的代码优先"来生成DB上下文和相关的模型类。

问题/误解

我有一个在另一个表中引用的表,所以EF生成了一个具有子对象的ICollection的类(为了简单起见,修改了表名等(:

[Table("Parent")]
public partial class Parent
{
   //Other Properties etc
   public virtual ICollection<Child> Children { get; set; }
}

问题

  1. 我想修改"Children"ICollection中的一个Item,只是为了测试我对流程的理解,并检查它是否有效,但似乎没有简单的方法可以做到这一点;没有。Item(int x(方法(是否希望此ICollection"仅供参考",并且必须进行单独的查询?(

或者有其他方法吗?

  1. 还没有深入研究过WPF DataBinding,是否可以将此ICollection绑定到窗体上的控件,并让用户操作数据,然后我可以获取这些数据并将更改保存到DB

实体框架和ICollection

我更喜欢控制导航属性,而不是让EF来控制。将类修改为以下内容:

[Table("Parent")]
public partial class Parent
{
    private List<Child> _children;
    public Parent()
    {
        _children = new List<Child>();
    }
    // other properties, etc.
    public List<Child> Children
    {
        get { return _children; }
        set { _children = value; }
    }
}

就DataBinding而言,您可以轻松地将任何ItemsControl的ItemsSource绑定到Child集合。例如:

<ComboBox ItemsSource="{Binding Path=Children}" />

上面的示例假设您的相对DataContext设置为您的Parent对象。

据我所知,请看看这是否对你有帮助。

using (var db = new DataBaseEntity())
{
    Child myChild = db.Parent.Select(x => x.Child);
    myChild.IsSelected = true;
    myChild.Name = "MyChildName";
    db.SaveChanges() //EF Tracks the items so u could simple commit the changes to Db.
 }

第二个问题:

我不认为您可以直接将ICollection绑定到WPf ItemSource中。尝试DTO或像这样将它们序列化到Observable Collection中。

ObservableCollection<Child> childCollection = new ObservableCollection<Child>();
_childCollection .Add(new Child
       { 
           // Serialize to Properties in the Child 
       });
// Bind the collection or property where u need
<List ItemSource="{Binding _ChildCollection}" />