【问题标题】:Bare-bones shallow serialization of ado.net entityado.net 实体的准系统浅序列化
【发布时间】:2012-04-23 15:35:54
【问题描述】:

我意识到已经发布了大量关于 ADO.Net 实体序列化的问题,但我没有找到真正解决我想做的事情的运气。

基本上,我需要一个 ADO.Net 实体的真正简单、浅 JSON 或纯对象表示。目的是记录变更;即当要更改记录时,我想在“之前”和“之后”获取其数据的副本,并记录更改。

我不希望考虑任何导航、复杂或其他属性;只是实体的标量属性。如果我错过了一些仅在特殊情况下才会出现的数据,那很好——只是尝试做一个粗略的日志。理想情况下,我的最终代码应如下所示:

Employee emp = db.Employees.First();

string oldRecordJSON = MySerializer.serialize(emp);

emp.Name = "Fred";
db.saveChanges();

string newRecordJSON = MySerializer.serialize(emp);

ChangeLog.logDBChange("Employees", emp.ID, oldRecordJSON, newRecordJSON, DateTime.Now);

...任何快速简便的方法来实现MySerializer.serialize?

谢谢!

【问题讨论】:

    标签: c# entity-framework serialization ado.net


    【解决方案1】:

    如果您只是想要员工的某些特定属性,请考虑创建一个基本模型并将其序列化。

    var serializer = new JavaScriptSerializer();
    serializer.Serialize(new MyEmployeeModel{ // set fields here});
    

    如果你愿意,你可以将它构建为转换器,这就是我的做法。

    我有一个接口,IConverter<TInputType, TOutputType>,您可以从中创建一个转换器以将(或任何您想做的)注入到您的代码中。

    public interface IEmployeeFromDatabaseToBasicEmployeeModelConverter 
         : IConverter<TheDBType, MyEmployeeModel>{}
    
    public class EmployeeFromDatabaseToBasicEmployeeModelConverter :
                                   IEmployeeFromDatabaseToBasicEmployeeModelConverter 
    {
      public MyEmployeeModel Invoke(TheDBType myDbTypeObject)
      {
         return new MyEmployeeModel{
          // set properties.
         }
      }
    }
    

    【讨论】:

    • 真的希望有一些完全通用的东西;这个项目的时间非常紧迫,只需要一个快速而肮脏的解决方案(不一定是“最佳”解决方案)。
    • 转换器可能不是又快又脏,但第一部分是。创建一个类来保存数据,创建一个对象,用你的数据填充它,序列化它。这是一个 30 秒的工作。
    • 或者只是序列化从数据库返回的对象。我看到你已经有了一个 Employee 对象。只需将其传递给我在答案中概述的序列化程序即可。
    • Ahhhhhh.... 你的意思是我可以直接将实体对象(在这种情况下为“Employee”)直接传递给 JavascriptSerializer?没想到是这样的!
    • 所以事实证明这只适用于没有任何循环关系的实体。我真正需要的是做与上面相同的事情,但跳过任何导航属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2018-07-12
    • 2016-10-11
    相关资源
    最近更新 更多