Entity Framework - 代码优先,删除字段而不更改架构
Entity Framework - code first, remove field without schema change
我正在研究使用 entity framework 代码优先方法的解决方案:
[XmlRoot(ElementName = "item")]
public class Item
{
[XmlElement("itemId")]
[Index("idx_item_id")]
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public long ItemId{ get; set; }
[XmlElement("otherId")]
[Index("idx_other_id")]
public long OtherId{ get; set; }
[XmlElement("randomStuff")]
public string RandomStuff{ get; set; }
}
并直接映射为:
public class DataContext : DbContext
{
public DataContext()
: base("name=DataContext")
{
Database.CommandTimeout = 180;
}
public DbSet<Item> Items{ get; set; }
所以基本上我有 XML 进来,这些直接映射到模型。一个HTTPPOST进来,xml使用模型反序列化,然后直接插入数据库。现在我不再对字段 RandomStuff
感兴趣,但我不想更改架构,我会简单地开始在那里插入 NULL
。写这样的东西是否有意义:
private string _randomStuff;
[XmlElement("randomStuff")]
public string RandomStuff
{
get { return _randomStuff; }
set
{
_randomStuff = null;
}
}
或者有没有更好的方法来实现这个?
最好的办法当然是硬着头皮更改架构。但我知道有很多理由不这样做(现在)。
更好的选择(然后 setter 中的 null
赋值)是使用私有 setter:
public string RandomStuff { get; private set; }
EF 可以处理私有 setters,通过这样做,EF 永远不会认为 属性 已经改变(因为它读取的值与设置的值不同)并且无用更新。而且您仍然可以阅读旧内容。
如果您不想显示内容,即使它仍然存在,我也会用新的虚拟 [=27] 替换 mapped 属性 =](再次使用私有 setter)并将 current 属性 标记为未映射。
我正在研究使用 entity framework 代码优先方法的解决方案:
[XmlRoot(ElementName = "item")]
public class Item
{
[XmlElement("itemId")]
[Index("idx_item_id")]
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public long ItemId{ get; set; }
[XmlElement("otherId")]
[Index("idx_other_id")]
public long OtherId{ get; set; }
[XmlElement("randomStuff")]
public string RandomStuff{ get; set; }
}
并直接映射为:
public class DataContext : DbContext
{
public DataContext()
: base("name=DataContext")
{
Database.CommandTimeout = 180;
}
public DbSet<Item> Items{ get; set; }
所以基本上我有 XML 进来,这些直接映射到模型。一个HTTPPOST进来,xml使用模型反序列化,然后直接插入数据库。现在我不再对字段 RandomStuff
感兴趣,但我不想更改架构,我会简单地开始在那里插入 NULL
。写这样的东西是否有意义:
private string _randomStuff;
[XmlElement("randomStuff")]
public string RandomStuff
{
get { return _randomStuff; }
set
{
_randomStuff = null;
}
}
或者有没有更好的方法来实现这个?
最好的办法当然是硬着头皮更改架构。但我知道有很多理由不这样做(现在)。
更好的选择(然后 setter 中的 null
赋值)是使用私有 setter:
public string RandomStuff { get; private set; }
EF 可以处理私有 setters,通过这样做,EF 永远不会认为 属性 已经改变(因为它读取的值与设置的值不同)并且无用更新。而且您仍然可以阅读旧内容。
如果您不想显示内容,即使它仍然存在,我也会用新的虚拟 [=27] 替换 mapped 属性 =](再次使用私有 setter)并将 current 属性 标记为未映射。