使用caliburn.micro实体框架自定义继承

时间:2017-07-05 13:02:36

标签: c# wpf entity-framework entity caliburn

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

2 个答案:

答案 0 :(得分:1)

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

Modifying Entity Framework Types T4 Template

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

答案 1 :(得分:1)

纯粹的' MVVM的做法(它不是一成不变的,许多人在他们的模型中实现通知)将反映视图模型中的属性。

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

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

您的视图模型将其转换为可查看的内容,非常简单的版本可以使用'模型'作为它的支持领域:

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链接到数据库,则在保存/加载更改等时也很有用。您可以实现保存/撤消或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?

完成这两项工作后,我建议您不要在模型中发出通知,并尽量保持尽可能简单。