实体框架 - 代码优先,删除没有架构更改的字段

时间:2015-08-17 19:38:11

标签: c# entity-framework ef-migrations

我正在研究一种使用实体框架代码第一种方法的解决方案:

[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进来,这些都直接映射到模型。 HTTP POST进来,使用模型对xml进行反序列化,然后直接插入数据库。现在我不再对字段RandomStuff感兴趣,但我不想更改架构,我只是开始在那里插入NULL。写下这样的内容是否合理:

    private string _randomStuff;
    [XmlElement("randomStuff")]
    public string RandomStuff
    {
        get { return _randomStuff; }
        set
        {
            _randomStuff = null;
        }
    }

或者有更好的方法来实现这一目标吗?

1 个答案:

答案 0 :(得分:4)

当然,最好的事情就是咬紧牙关并改变架构。但我知道有很多理由不这样做(就在那时)。

更好的选择(然后是setter中的null赋值)是使用私有的setter:

public string RandomStuff { get; private set; }

EF可以处理私人设置器,通过这样做,EF将永远不会认为该属性已更改(因为它读取的值与设置的值不同)并且无法更新。而你仍然可以阅读旧内容。

如果您不想显示内容,即使它仍然存在,我也会将映射的属性替换为新的虚拟属性(同样私有的setter)并将当前属性标记为未映射。