Entity framework 与 caliburn.micro 的自定义继承

Entity framework custom inheritance with caliburn.micro

我正在编写一个 WPF 应用程序,使用 caliburn.micro 来处理数据库。我使用 entity framework 和数据库优先方法(因为我已经有一个数据库)来生成 classes。是否有可能使 entity framework gererate classes 继承 caliburn 的 PropertyChangedBase class 或者使它们实现 IHandle 接口。我需要这些 classes 来让视图知道数据何时被更改。

您可以在项目中编辑 .tt 模板的副本:

自动生成的实体 类 是使用此模板创建的。

'pure' MVVM 的实现方式(它不是一成不变的,许多人确实在他们的模型中实现了通知)将在您的视图模型中镜像属性。

Person为例,您的模型是一个简单的POCO:

public class Person
{
    public String FirstName { get; set; }
    public String Surname { get; set; }
}

您的视图模型将其转换为要查看的内容,一个非常简单的版本可以使用 'model' 作为支持字段:

public class PersonViewModel : PropertyChangedBase
{
    private Person person;
    public Person Person
    {
        get { return person; }
        set { person = value;
              NotifyOfPropertyChange(() => FirstName);
              NotifyOfPropertyChange(() => Surname)};
    }

    public String FirstName
    {
        get { return Person.FirstName; }
        set
        {
            if (Person.FirstName != value)
            {
                Person.FirstName = value;
                NotifyOfPropertyChange(() => FirstName);
            }
        }
    }

    public String Surname
    {
        get { return Person.Surname; }
        set
        {
            if (Person.Surname != value)
            {
                Person.Surname = value;
                NotifyOfPropertyChange(() => Surname);
            }
        }
    }
}

如果您的模型通过 EF 链接到数据库,它在 saving/loading 更改等时也很有用。您可以实施 save/undo 或 IsDirty 跟踪:

public class PersonViewModel : PropertyChangedBase
{
    private Person person;
    public Person Person
    {
        get { return person; }
        set { person = value; }
    }

    private String firstName;
    public String FirstName
    {
        get { return firstName; }
        set
        {
            if (firstName != value)
            {
                firstName = value;
                NotifyOfPropertyChange(() => FirstName);
            }
        }
    }

    private String surname;
    public String Surname
    {
        get { return surname; }
        set
        {
            if (surname != value)
            {
                surname = value;
                NotifyOfPropertyChange(() => Surname);
            }
        }
    }

    public void SaveToModel()
    {
        Person.FirstName = FirstName;
        Person.Surname = Surname;
        // trigger EF save?
    }

    public void LoadFromModel()
    {
        FirstName = Person.FirstName;
        Surname = Person.Surname;
    }
}

有关在模型上实施 PropertyChange 的利弊的大量讨论,请参阅这些问题:

MVVM duplicating Model properties in ViewModel

In MVVM model should the model implement INotifyPropertyChanged interface?

In MVVM should the ViewModel or Model implement INotifyPropertyChanged?

两者都完成后,我建议您将通知排除在模型之外,并努力使其尽可能简单。