我正在使用EF6从模型第一次改为代码 我首先从数据库选项中使用Code来生成我的类。
这些将与WPF应用程序一起使用。 不幸的是,生成的项目没有ObservableCollections,也没有实现INotiftyPropertyChanged。
我想知道有没有办法自动化这个(通过改变c#生成的类的行为,首先从DB选项中选择代码。否则我将不得不通过手工进行更改,这将是因为我们有100多张桌子,所以非常繁琐。
示例生成类(注意属性和类不实现INotiftyPropretyChanged,ICollections初始化为HashSets,当我们想要ObersvableCollections时),这些要求用于与WPF / XAML进行数据绑定原因:
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
[Table("TerminalSession")]
public partial class TerminalSession
{
public TerminalSession()
{
TerminalCheckpoints = new HashSet<TerminalCheckpoint>();
TerminalFloats = new HashSet<TerminalFloat>();
TerminalTransactions = new HashSet<TerminalTransaction>();
}
public int TerminalSessionID { get; set; }
public int? TerminalID { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public virtual ICollection<TerminalCheckpoint> TerminalCheckpoints { get; set; }
public virtual ICollection<TerminalFloat> TerminalFloats { get; set; }
public virtual ICollection<TerminalTransaction> TerminalTransactions { get; set; }
}
}
我们真正想要的代码:
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
[Table("TerminalSession")]
public partial class TerminalSession : INotifyPropertyChanged
{
private int _terminalSessionId;
private int? _terminalId;
private DateTime? _startDate;
private DateTime? _endDate;
public TerminalSession()
{
TerminalCheckpoints = new ObservableCollection<TerminalCheckpoint>();
TerminalFloats = new ObservableCollection<TerminalFloat>();
TerminalTransactions = new ObservableCollection<TerminalTransaction>();
}
public int TerminalSessionID
{
get { return _terminalSessionId; }
set
{
if (value == _terminalSessionId) return;
_terminalSessionId = value;
OnPropertyChanged();
_terminalSessionId = value;
}
}
public int? TerminalID
{
get { return _terminalId; }
set
{
if (value == _terminalId) return;
_terminalId = value;
OnPropertyChanged();
_terminalId = value;
}
}
public DateTime? StartDate
{
get { return _startDate; }
set
{
if (value == _startDate) return;
_startDate = value;
OnPropertyChanged();
_startDate = value;
}
}
public DateTime? EndDate
{
get { return _endDate; }
set
{
if (value == _endDate) return;
_endDate = value;
OnPropertyChanged();
_endDate = value;
}
}
public virtual ObservableCollection<TerminalCheckpoint> TerminalCheckpoints { get; set; }
public virtual ObservableCollection<TerminalFloat> TerminalFloats { get; set; }
public virtual ObservableCollection<TerminalTransaction> TerminalTransactions { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
选项我在visual studio中选择。
答案 0 :(得分:5)
MSDN上Customizing Code First to an Existing Database提供了相关说明。
基本上你所做的就是将EntityFramework.CodeTemplates.CSharp NuGet包(或.VisualBasic,如果这是你的首选语言)添加到你的项目中,它会将向导使用的T4模板添加到CodeTemplates\EFModelFromDatabase
文件夹在你的项目中。
然后根据自己的喜好修改T4模板,然后重新运行向导以从数据库中重新生成模型。
答案 1 :(得分:0)
答案 2 :(得分:0)
我认为Brian Hinchley在这个问题上的答案的答案也适用于INotiftyPropertyChanged(这个问题仅适用于早期版本的EF,EF 4.(某事)。
How to get property change notifications with EF 4.x DbContext generator
如果有效,我将修改我的答案,更多细节+如何进行可观察收集部分的说明(现在只测试它)。