C#在属性更改时,运行逻辑

时间:2018-04-12 07:31:53

标签: c# entity-framework

我有一个C#Entity,它首先通过数据库自动生成:

public partial class Zone
{
    public Guid LocationId {get; set;}
    ...
}

我需要做的是在更改Process()时运行一个函数LocationId。现在通常我会改变setter和完成的工作,但是因为这是首先通过数据库自动生成的,所以如果重新生成代码,任何"文件的手动更改都将被覆盖。&#34 ;

这里最好的方法是什么?

目前的想法是创建一个新的分部类来做这样的事情:

public partial class Zone
{
    private Guid _pendingLocationId
    public Guid PendingLocationId {
      get { return _pendingLocationId }
      set { 
        Guid updatedLocation = Process(value) ?? value;
        _pendingLocationId = updatedLocation;
        locationId = updatedLocation;
      }
    }
}

只是一个注释; 不幸的是,在这个阶段我们可能没有机会将新框架或库集成到应用程序中。

回应可能的duplicate标志;除非我误读,否则这需要我们将所有Zone引用重新映射/封装到一个新类中,不仅要将其推送到所有视图,还要编辑许多linq查询等。如果有人可以识别为什么这会是我自己建议的解决方案的首选解决方案,请告诉我。

3 个答案:

答案 0 :(得分:2)

执行此操作的最少侵入性方法可能是使用AOP模式,例如,使用PostSharp框架:少于2行代码

[NotifyPropertyChanged]  //<---Add this attributes to the class
public class Zone 
{ 
    public Guid LocationId {get; set;}
    ...

}

挂钩已更改的事件并添加自己的处理程序

//Zone instance;
((INotifyPropertyChanged) instance).PropertyChanged += ZoneOnPropertyChanged;

可以找到更多详细信息here

  

更新:OP提到将其他库集成到应用程序中的可能性为零,我只是好奇,你不使用nuget吗?这个零机会的原因是什么?在我个人看来,如果已经有一个具有所需功能的库,你应该而不是不重新发明轮子。

如果许可成本是问题或者是过度杀戮或 为了解决问题而引入这个庞大的库,我想Fody ,可以考虑使用PostSharp的免费开源替代方案。更具体的PropertyChanged.Fody包,非常 独立,紧凑且重量轻

答案 1 :(得分:0)

我建议使用AutoMapper

您可以编写另一个具有相同名称和属性的类(使用INPC),但是在不同的命名空间中。然后,每次获取数据库时,都可以使用Automapper将数据映射到通知类中,每次将数据保存到数据库时都会将数据映射回来。

这样你只需要使用你的类更改代码中的命名空间,并将这样的代码添加到你的存储库中:

var dtos = args.Select(x => Mapper.Map<Zone>(x)).ToList();

答案 2 :(得分:0)

将业务实体映射到yr数据库实体(通过AutoMapper),然后在您的业务实体中,合并INotifyPropertyChanged接口。

下面的伪代码。这将使您的数据库与业务实体分离,并允许独立更改。

namespace DBEntity {
    public class Customer {
         public int Id { get; set; }  ...
    }
}

namespace BizEntity {
    public class Customer : INotifyPropertyChanged {
         private int id;
         public int Id { 
                  get { return this.id } ; 
                  set { 
                       this.id = value; 
                       PropertyChanged(Id...);
                       }
                  }
         NotifyPropertyChanged() {
                    ....
         }

var dbCustomer = GetCustomerFromDB()
var cust = AutoMapper.Mapper.Map<DBEntity.Customer, BizEntity.Customer>(dbCustomer);

// Update the property as per biz requirement
cust.Id = 53656;      // Fires the Notification

如果有帮助,请告诉我 关于AutoMapper作为一个新的库,这将是一个最小的变化,这里不需要许可或学习曲线,以实现快速集成。