1

我在 winforms 表单上有一个带有 bindingsource 的绑定导航器。我的数据源来自实体框架列表。

我想使用从Pluralsight 的 Julie Lerman 课程中学到的技术来跟踪绑定源中每个实体的状态

添加和编辑很简单,我只是填写了添加和删除按钮事件

    private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
    {
        ((IEntity)(this.personBindingSource.Current)).State = EntityState.Added;
    }

    private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
    {
        ((IEntity)(this.personBindingSource.Current)).State = EntityState.Deleted;
    }

但是没有 EditItemClick 事件,我如何跟踪实体是否已被修改?

注意我绑定到域类 Person 的断开连接列表

 List<Person> people = MyRepository.GetPeople();
 this.personBindingSource.DataSource =people;
 this.personBindingNavigator.BindingSource = this.personBindingSource;

我有一个接口 IENTity

public interface IEntity
{

    EntityState State { get; set; }
}



public enum EntityState
{
    Unchanged,
    Added,
    Modified,
    Deleted
}

并且 Person 继承自该 [Update] 查看 bindingSource 事件属性,我看到 CurrentItemChanged 在属性被修改时引发。但是,当当前项目本身更改时也会引发它。
有没有办法弄清楚它被提出的原因是什么?

4

2 回答 2

0

由于您的实体已断开连接,因此无法通过上下文进行更改跟踪,因此您需要自己跟踪更改。

如果您更改存储库方法以创建您正在检索的人员的克隆,我们可以在保存点重新连接原始实体。

List<Person> originalPeople;
List<Person> modifiablePeople = MyRepository.GetPeople(out originalPeople);

您可以阅读 创建包含当前、原始或数据库值的克隆对象部分,以了解如何创建原始人员对象的克隆。

MyRepository.SavePeople 将采用两个参数,originalPeople(克隆)和 modifiablePeople(绑定到包含更改的 UI 的修改后的人)。然后,您将以未修改的状态重新附加您的 originalPeople,然后以迭代方式应用修改后的人员的属性更改:

var entry = context.Entry(original Person); 
entry.CurrentValues.SetValues(modifiedPerson);

阅读以下部分: 从另一个对象设置当前值或原始值

于 2014-07-06T08:02:08.257 回答
0
private void bindingSource_ListChanged(object sender, ListChangedEventArgs e)
    {
        if (e.ListChangedType == ListChangedType.ItemChanged)
        {
            var entity = (IEntity)((BindingSource)sender).Current;
            if (entity.State == EntityState.Unchanged)
            {
                entity.State = EntityState.Modified;
            }
        }
    }
于 2014-07-07T00:01:04.073 回答