从“Code First From Database”EF6更改生成的类

时间:2014-12-15 15:58:07

标签: c# wpf entity-framework

我正在使用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中选择。 enter image description here

3 个答案:

答案 0 :(得分:5)

MSDN上Customizing Code First to an Existing Database提供了相关说明。

基本上你所做的就是将EntityFramework.CodeTemplates.CSharp NuGet包(或.VisualBasic,如果这是你的首选语言)添加到你的项目中,它会将向导使用的T4模板添加到CodeTemplates\EFModelFromDatabase文件夹在你的项目中。

然后根据自己的喜好修改T4模板,然后重新运行向导以从数据库中重新生成模型。

答案 1 :(得分:0)

你有解决方案: http://msdn.microsoft.com/en-us/data/jj574514.aspx

它在

部分

“更新数据绑定的代码生成”

此致

答案 2 :(得分:0)

我认为Brian Hinchley在这个问题上的答案的答案也适用于INotiftyPropertyChanged(这个问题仅适用于早期版本的EF,EF 4.(某事)。

How to get property change notifications with EF 4.x DbContext generator

如果有效,我将修改我的答案,更多细节+如何进行可观察收集部分的说明(现在只测试它)。