2012-04-12 37 views
8

我創建了以下POCO類,並且還將Contact.FirstNameContact.LastName屬性設置爲私有屬性(這些屬性映射到實體框架模型中的相應屬性)。實體框架,POCO和一個私有屬性

public class Contact 
{ 
    public int ContactID { get; set; } 
    private string FirstName { get; set; } 
    public string LastName { get; private set; } 
} 

我期望得到一個異常,因爲EF不能夠給這兩個屬性賦值,但是EF仍然設法給它們賦值。這怎麼可能,因爲只有Contact類中的代碼才能訪問私有屬性?

謝謝

+31

實體框架很神奇。它可以做任何想要的事情。 – 2012-04-12 17:57:43

+0

你有沒有映射代碼?無需顯式配置(或EF 4.3中的註釋)即可映射私有屬性實際上應該不那麼容易:http://blog.oneunicorn.com/2012/03/26/code-first-data-annotations-on-non-public-屬性/ – Slauma 2012-04-12 18:28:44

+0

@Slauma:我正在使用數據庫第一種方法 – user702769 2012-04-12 19:01:33

回答

16

與信任的足夠水平的環境中,reflection可以用來訪問成員哪一個會無法正常訪問。

+0

所以這也是測試項目能夠訪問私有成員的方式嗎? – McGarnagle 2012-04-12 18:00:30

+2

@dbaseman:是的,但還有一個'InternalsVisibleAttribute',它有時候被測試代碼用來使它的內部成員可以在單元測試中訪問,而不需要反射。 – 2012-04-12 18:01:40

+0

謝謝大家的幫助 – user702769 2012-04-12 19:00:30

0

是 - EF,代碼首先被利用,在夫婦的地方。

我已經看到類似私有構造函數的行爲 - EF/CF仍然可以構造你的對象,即使你'隱藏'它或嘗試:)(這是早期版本中的行爲,現在不確定) 。

我記得有與CF人爲什麼他們不初始化複合型性質的一些討論 - VS他們仍然是確定與訪問私有成員(如果我沒有記錯),是很久以前。

所以,一般問題的一點 - 但在這個意義上說希望這個澄清的東西最少。

1

爲了完整性:EF5代碼先不(至少默認情況下)映射私有屬性的數據庫表列。

下面的類:

public class Person { 
    public int PersonId { get; set; } 
    private string Name { get; set; } 
} 

用下面的DbContext:

public class PrivatePropertiesContext : DbContext { 
    public DbSet<Person> People { 
    get; 
    set; 
    } 
} 

生成一個人表只有一列:dbo.People.PersonId (PK, int, not null)

公鑰屬性默認規範要求第一個約定。如果Person類中的PersonId屬性將是私有的或受保護的,則實體框架將引發以下異常:

System.Data.Entity.Edm.EdmEntityType: : EntityType 'Person' has no key defined. Define the key for this EntityType. 
System.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'People' is based on type 'Person' that has no keys defined.