2014-09-13 141 views
0

我首先使用EF5模型。我真的不明白什麼是EDM自動生成的類。根據一些文檔,這些類是POCO,但爲什麼它們在上下文中使用? 假設我有一個Student實體,那麼我在我的上下文中獲得一個Student POCO類和一個DbSet StudentSet屬性。 這個下一條指令會在我的數據庫中放置一個POCO嗎?帶實體框架的DTO/POCO

MyContext.StudentSet.Add(johndoe); 
MyContext.SaveChanges(); 

因此,EF使用POCO來傳輸數據?實際上,我錯過了POCO與實體或DTO交換數據以及實體將數據放入數據庫時​​的步驟。

+0

你有什麼試過的,是的,你的代碼會把JohnDoe放到你的數據庫中。如果您在DTO上攜帶數據,則需要根據DTO的屬性設置POCO。 – 2014-09-13 13:28:52

回答

1

EDM生成的類是ORM/Persistence類。您可以使用這些類來查詢/從/到數據庫進行更改。在更改數據庫時,您需要將任何DTO對象轉換爲POCO對象。

ORM是關於將對象映射到數據庫中的數據,而不是處理insert into語法將記錄插入到應用程序中的數據庫,您使用StudentSet.Add來添加新數據。 johndoe信息將被轉換爲sql語法,EF將每個屬性映射到每個列時將其轉換爲查詢。

Add方法會將johndoe信息作爲Added存儲在內存中,但不會立即執行到數據庫。如果您有其他Add方法,它也將被標記爲Added。您撥打SaveChanges的那一刻,所有更改將通過發送生成的查詢保存到數據庫中。

DTO和EF實體之間的映射發生在添加johndoe之前。您可能會在UI中使用另一個DTO類。您需要手動映射它或使用映射器庫來從DTO對象創建一個POCO對象。例如:

// studentDto as parameter 

var johndoe = new Student 
{ 
    Name = studentDto.StudentName, 
    Age = studentDto.StudentAge 
}; 
MyContext.StudentSet.Add(johndoe); 

// studentDto might have another information as well 
var johndoeSubject = new Subject 
{ 
    Name = studentDto.SubjectName, 
    Years = studentDto.SubjectYears 
}; 
MyContext.SubjectSet.Add(johndoeSubject); 

MyContext.SaveChanges(); 
+0

謝謝Yuliam,但爲什麼你添加一個學生而不是你的上下文的StudentDto? – Llm 2014-09-13 21:45:52

+0

@Lm,因爲數據庫中的表Student被映射到Student類中,而不是StudentDto類,所以可以使用xml編輯器打開EDMX文件,並查看EF,CSDL,SSDL和MSL使用的映射配置。 – 2014-09-14 03:36:39

+0

Ok I現在得到它。所以我應該使用DTO將數據傳遞給我的視圖?實際上,我正在尋找一種方法在我從EF獲得的東西和我傳遞給我的視圖以增加一些安全性之間添加一個圖層... – Llm 2014-09-15 08:01:54