C# Linq数据映射:列属性上存储属性的使用

C# Linq数据映射:列属性上存储属性的使用,c#,linq,mapping,C#,Linq,Mapping,有人能解释一下使用列属性的以下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 {

有人能解释一下使用
列属性的以下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之间怎么会有任何区别。

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()
时产生错误。因为您正在同时使用名称和存储属性