我正在研究一种使用实体框架代码第一种方法的解决方案:
[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;
}
}
或者有更好的方法来实现这一目标吗?
答案 0 :(得分:4)
当然,最好的事情就是咬紧牙关并改变架构。但我知道有很多理由不这样做(就在那时)。
更好的选择(然后是setter中的null
赋值)是使用私有的setter:
public string RandomStuff { get; private set; }
EF可以处理私人设置器,通过这样做,EF将永远不会认为该属性已更改(因为它读取的值与设置的值不同)并且无法更新。而你仍然可以阅读旧内容。
如果您不想显示内容,即使它仍然存在,我也会将映射的属性替换为新的虚拟属性(同样私有的setter)并将当前属性标记为未映射。