2关于实体框架中的自定义数据类型和自动执行的问题...
我有一个类能够提供自身的字符串表示,并从字符串构造自己。反正有没有把这个类作为E-CF类的属性包含在内并让它在下面创建一个字符串? e.g:
public class MySpecialClass
{
public MySpecialClass(string _data)
{
} // eo ctor
public string ToString()
{
} // eo ToString
} // eo MySpecialClass
public class EntityObject
{
public MySpecialClass Special {get; set; }
} // eo class EntityObject
那真的很有用!
我有很多类都有CreatedBy
,ModifiedBy
,ModifiedDate
etceteras等类。有没有一种简单的方法可以在首次创建对象时或在以后修改对象时自动设置这些?理想情况下,我想要一个可以实现这种行为的事件,因为如果某些字段发生变化,我的某些对象实际上需要写入“历史”表。实际上,有没有办法做到这一点?要知道在更新期间是否修改了某个字段?
答案 0 :(得分:1)
在您的实体中,您必须将属性定义为字符串。 EF无法使用自定义类。每个生成的实体类都定义为partial,因此您可以在partial类中定义其他属性,该属性将与您的类型实例一起使用:
// EF generated part
public partial class EntityObject
{
protected string SpecialString { get; set; }
}
// Your part
public partial class EntityObject
{
public MySpecialClass Special
{
get
{
return MySpecialClass.Deserialize(SpecialString);
}
set
{
SpecialString = MySpecialClass.Serialize(value);
}
}
}
您将无法在Linq-To-Entities查询中使用特殊属性。
修改强>
我没注意到你在使用 代码优先。在这种情况下,你不要使用 实体和你的部分类 可以在单个实体中使用相同的方法 MySpecialClass将被标记的位置
NotMappedAttribute
。
对于您的第二个问题 - 它通常是数据访问层(当前非常流行的存储库模式)的责任。 EF中唯一可用的内置事件是
ObjectCotnext.ObjectMaterialized
- 从数据库加载数据并创建对象实例时触发ObjectContext.SavingChanges
- 在EF执行DB 如果您覆盖SaveChanges
方法,则可以添加一些自定义事件。