有人能解释一下使用ColumnAttribute
:的以下三种可能性之间的区别吗
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/sette,但在情况A或C中不使用,这是正确的吗?)
但我不明白A和C之间怎么会有任何区别。
C有助于让引擎理解表达式树,例如谓词:
var items = ctx.SomeTable.Where(x => x.ParentId == 21);
对于"a",我希望它会失败,因为它并不真正了解属性ParentId
(只有字段m_parentid
和数据库列)。在"c"中指定"存储"可以将db值直接保存到字段中,而不是使用该属性,从而避免了在从db实现时不需要的代码。
对于案例A,我同意Marc Gravell的观点。
在情况B中,这就像使用私有数据成员m_ParentId
一样,可以通过公共属性ParentID访问。并且该属性使用表列parentId进行映射。
情况C将在db.getTable(<Class Name>)
时产生错误。因为您同时使用名称和存储属性。