Linq数据映射:在列属性上使用Storage属性

时间:2011-06-04 06:21:42

标签: c# linq mapping

有人可以解释使用ColumnAttribute的以下3种可能性之间的区别:

A:字段上的属性

[Column(Name="ParentId")]
private int m_parentid;
public int ParentId { get { return m_parentid; } set { m_parentid = value; } }

B:属性属性

private int m_parentid;
[Column(Name="ParentId")]
public int ParentId { get { return m_parentid; } set { m_parentid = value; } }    

C:具有存储集的属性的属性

private int m_parentid;
[Column(Name="ParentId", Storage="m_parentid")]
public int ParentId { get { return m_parentid; } set { m_parentid = value; } }    

我可以理解,在非平凡的getter / setter的情况下,B将与A和C不同(Linq可能在案例B中使用getter / setter,但在A或C的情况下不是,那是正确的吗?)

但我不明白A和C之间有什么区别。

2 个答案:

答案 0 :(得分:3)

C对于允许引擎理解表达式树很有用,例如谓词:

var items = ctx.SomeTable.Where(x => x.ParentId == 21);

对于“a”,我希望这会失败,因为它并不真正了解属性ParentId(只有字段m_parentid和数据库列)。在“c”中指定“存储”允许将db值直接保存到字段而不是使用属性,从而避免在数据库实现期间不需要的代码。

答案 1 :(得分:0)

对于案例A,我同意Marc Gravell的观点。

在案例B中,就像使用私有数据成员m_ParentId可通过公共属性ParentID访问一样。并且该属性使用表列parentId进行映射。

案例C会在db.getTable(<Class Name>)时产生错误。因为您一起使用名称和存储属性。