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 属性 标记为未映射。