2017-12-04 29 views
13

Tôi cố gắng để cập nhật với Dapper.Contrib bảng này:Dapper UpdateAsync bỏ qua cột

public class MyTable 
{ 
    public int ID { get; set; } 
    public int SomeColumn1 { get; set; } 
    public int SomeColumn2 { get; set; } 
    public int CreateUserID { get; set; } 
    public int UpdateUserID { get; set; } 
} 

Tôi không muốn cập nhật cột CreateUserID bởi vì nó là một phương pháp cập nhật vì vậy mà tôi muốn bỏ qua cột này trong khi gọi phương thức Dapper - Update.Async (thực thể).

Tôi đã thử sử dụng thuộc tính [NotMapped] và [UpdateIgnore] nhưng không được trợ giúp.

Lưu ý: Tôi vẫn muốn cột này được chuyển vào hoạt động chèn, do đó, [Tính toán] và [Viết (sai)] không phù hợp.

Ai đó có thể giúp tôi tìm ra cách bỏ qua cột này khi cập nhật bảng trong cơ sở dữ liệu?

Xin cảm ơn trước.

+3

Bạn phải sử dụng một số thư viện khác, Dapper không có tiện ích Update.Async. Có lẽ Dapper-phần mở rộng hoặc một cái gì đó tương tự? –

+1

@VoidRay Chính xác. Dapper.Contrb.Extensions –

+1

nếu bạn đang sử dụng mẫu kho lưu trữ/hoặc bất kỳ mẫu đóng (và bạn nên tách mã của bạn khỏi triển khai cụ thể), bạn có thể chỉ cần ghi đè 'Cập nhật' và sử dụng logic của riêng bạn. –

Trả lời

1

Tôi khuyên bạn nên sử dụng thuộc tính [Đã tính]. Dapper.Contrib Readme.md

+1

Dường như tài liệu cho Dapper.Contrib được diễn đạt một cách khó hiểu. Thuộc tính [Tính] cũng bị bỏ qua khi chèn - điều này có thể hoặc có thể không hoạt động đối với trường hợp sử dụng của bạn. – BlakeH

+1

Tôi đã thử nó trước nhưng nó không hoạt động trên các hoạt động chèn vì nó bỏ qua nó. Tôi cần phải bỏ qua nó chỉ khi cập nhật. –

2

Vâng, nó không được hỗ trợ. Đây là liên quan issue, và giải pháp dự kiến ​​chỉ trong Dapper v2. Bạn cũng có thể kiểm tra source code (nó khá đơn giản) và thấy rằng tính cập nhật được tìm kiếm như sau:

var allProperties = TypePropertiesCache(type); 
keyProperties.AddRange(explicitKeyProperties); 
var computedProperties = ComputedPropertiesCache(type); 
var nonIdProps = allProperties.Except(keyProperties.Union(computedProperties)).ToList(); 

Vì vậy, tất cả các thuộc tính không được đánh dấu với Key \ ExplicitKey \ tính toán và được ghi được bao gồm. Điều tương tự cũng xảy ra cho InsertAsync (ngoại trừ các thuộc tính với ExplicitKey cũng được bao gồm trong chèn, nhưng bạn không thể sử dụng thuộc tính này trong situtaion của bạn, bởi vì thuộc tính của bạn không phải là chìa khóa sau khi tất cả).

Vì vậy, bạn phải chờ đợi để thực hiện điều này, ngã ba và tự thực hiện hoặc chỉ cần viết phương thức UpdateAsync của riêng bạn. Bạn có thể thấy từ mã nguồn mà nó rất đơn giản và không khó để thực hiện lại.

2

Như @Evk đã đề cập trong câu trả lời của anh ấy, chưa có giải pháp nào được triển khai. Ông cũng đã đề cập đến cách giải quyết.

Ngoài ra, bạn có thể chọn sử dụng Dapper (IDbConnection.Execute(...)) trực tiếp bỏ qua Dapper.Contrib cho trường hợp cụ thể này.

Tôi đã gặp sự cố tương tự (với DapperExtensions) với cập nhật cột cụ thể và các truy vấn phức tạp khác mà DapperExtensions không thể tạo hoặc cần nhiều công việc để làm cho nó xảy ra với nó.

Tôi đã sử dụng Dapper trực tiếp thay vì DapperExtensions cho trường hợp cụ thể đó; một phần khác của dự án vẫn có lợi cho DapperExtensions. Điều này giống như tread-off. Những trường hợp này rất hạn chế. Tôi thấy đây là giải pháp tốt hơn thay vì tinh chỉnh/ép DapperExtensions cho việc này. Điều này cũng giúp tôi tiết kiệm thời gian và công sức.

Các vấn đề liên quan