2016-03-24 95 views
5

我一直在玩Dapper,試圖看看它是否是一個很好的實體框架的輕量級替代品。到目前爲止,我已經對它能夠快速從數據庫中獲取實體<model>並將其獲取到模型的IEnumerable中,或者僅創建一個模型實例的能力印象深刻。很光滑。可以用Dapper更新和插入模型嗎?

但是我沒有看到的是將該模型更新回db的簡單方法。

例子:

public class Dog 
{ 
    public Guid Id { get; set; } 
    public int? Age { get; set; } 
    public string Name { get; set; } 
    public float? Weight { get; set; } 
} 

我們可以輕鬆地創建狗的IEnumerable如下:

IEnumerable<Dog> dogs = connection.Query<Dog>("SELECT * FROM Dog") 

或者,對於單個實例:

Dog dog = connection.Query<Dog>("SELECT * FROM Dog WHERE DogId = @dogid") 

這一切的偉大工程。但是現在,如果我們對「狗」進行更改(比如說,只是改變它的權重),是否有一種簡單,快速,簡單的方法將該實體返回到數據庫中,而無需執行手動UPDATE查詢,列出每個字段?

謝謝!

+1

似乎傳遞'名單'應[插入多個項目(http://stackoverflow.com/a/6500834/69809)? btw堅持參數化查詢('SELECT * FROM Dog WHI DogId = @ DogId'),除非您喜歡sql注入攻擊。 – Groo

+0

該語法如何工作?在看GitHub上的自述文件時,我沒有看到這樣的例子。 https://github.com/StackExchange/dapper-dot-net –

+0

大概就像我鏈接到的答案:'connection.Execute(@「更新狗設置名稱= @名稱,年齡= @年齡」,列表);'? – Groo

回答

6

可以使用SqlMapperExtensions類從Dapper.Contrib.Extensions

using Dapper; 
using Dapper.Contrib.Extensions; 

// don't forget the using since Update is an extension method 

Dog entity; // you got it from somewhere 
entity.Name = "fancy new dog name"; 
connection.Update(entity); 

爲了這個工作,你需要到[關鍵]註釋添加到您的ID。 應該是這個樣子:

using System.ComponentModel.DataAnnotations; 

public class Dog 
{ 
    [Key] 
    public long Id { get; set; } 
    public int? Age { get; set; } 
    public string Name { get; set; } 
    public float? Weight { get; set; } 
} 
+0

好吧!這更是我所希望的。在我可以測試這一點之前還需要一段時間,但是在我完成之後,當我開始工作時,我會將其標記爲答案。 –

6

Dapper是一種Micro-Orm,具有簡單快速的特點。你描述的行爲更多地與完全成熟的ORM相關,這意味着有一些排序的會話概念,映射和查詢生成(希望驅動程序用於不同的SQL風格)。這絕對不是小巧玲瓏的精神,這無論如何讓更新的過程/插入easyer是純ado.net,接受POCO對象作爲查詢參數,即:

.Execute("update mydogs set [email protected] where [email protected]",dog); 
+0

好的,這是有道理的。幾個問題。 (at)年齡和(at)id如何填充?他們是否在查詢結束時自動填入「,dog」? (我不能在這個評論中使用AT標誌或者堆棧溢出認爲我試圖通知用戶) –

+0

是的參數是通過從「狗」instyance屬性值中獲取的,並帶有相應的名稱 –