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

前端 未结 8 921
忘了有多久
忘了有多久 2020-11-27 18:29

I\'m playing around with Entity Framework 4.3, and so I am using the DbContext Generator to create the context and entity classes.

With the default EF 4 code genera

8条回答
  •  执笔经年
    2020-11-27 19:25

    I recently stumbled upon this problem, i edited my Entity.tt to implement the following changes, a quick patch but works great..

    Add the following to the CodeStringGenerator class

    public string EntityClassOpening(EntityType entity)
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} {1}partial class {2}{3} : {4}",
            Accessibility.ForType(entity),
            _code.SpaceAfter(_code.AbstractOption(entity)),
            _code.Escape(entity),
            _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)),
            "INotifyPropertyChanged");
    }
    
    
    public string Property(EdmProperty edmProperty)
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} {1} {2} {{ {3}{6} {4}{5} }}",
            Accessibility.ForProperty(edmProperty),
            _typeMapper.GetTypeName(edmProperty.TypeUsage),
            _code.Escape(edmProperty),
            _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
            _code.SpaceAfter(Accessibility.ForSetter(edmProperty)),
            "set { _"+_code.Escape(edmProperty).ToLower()+" = value; OnPropertyChanged(\""+_code.Escape(edmProperty)+"\");}",
            "get { return _"+_code.Escape(edmProperty).ToLower()+"; }");
    
    }
    public string Private(EdmProperty edmProperty) {
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} {1} _{2};",
            "private",
            _typeMapper.GetTypeName(edmProperty.TypeUsage),
            _code.Escape(edmProperty).ToLower());
    
    }
    

    Add the following to the generator

    using System.ComponentModel;
    <#=codeStringGenerator.EntityClassOpening(entity)#>
    {
    <#
    var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity);
    var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity);
    var complexProperties = typeMapper.GetComplexProperties(entity);
    #>
    
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    

    And abit further down

    foreach (var edmProperty in simpleProperties)
    {
    #>
    <#=codeStringGenerator.Private(edmProperty)#>
        <#=codeStringGenerator.Property(edmProperty)#>
    <#
    }
    
    
    foreach(var complexProperty in complexProperties)
    {
    #>
    <#=codeStringGenerator.Private(complexProperty)#>
        <#=codeStringGenerator.Property(complexProperty)#>
    <#
    }
    

提交回复
热议问题