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?
两者都完成后,我建议您将通知排除在模型之外,并努力使其尽可能简单。
我正在编写一个 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?
两者都完成后,我建议您将通知排除在模型之外,并努力使其尽可能简单。