簡體   English   中英

僅在使用Dapper更新時忽略屬性?

[英]Ignore a property only on Update with Dapper?

建立

作為我的數據訪問層的一部分,我使用Dapper與DapperExtensions並用模型表示我的數據庫實體。 其中一些模型包含用於記錄或更改跟蹤的字段,如下所示:

public class ExampleClass : BaseModel, ITypeWithChangeTracking
{
    public int ExampleClassId { get { return Id; } set { Id = value; } }
    public DateTime CreatedDate { get; set; }
    public string CreatedBy { get; set; }

    // More properties
}

public class ExampleClassMapper : ClassMapper<ExampleClass>
{
    public ExampleClassMapper() : base()
    {
        Map(m => m.ExampleClassId).Key(KeyType.Identity);
        Map(m => m.Id).Ignore();
        base.AutoMap();
    }
}

在這個例子中,BaseModel是一個抽象類,它指定模型有一些整數Id(以便更容易使用泛型); ITypeWithChangeTracking指定它應具有更改跟蹤字段。 到目前為止,我已經能夠將大多數DAL邏輯轉換為可以在所有模型之間共享的通用實現,並且我希望將其與實現更改跟蹤的那些保持一致。

使用的工具

C#

短小精悍的

DapperExtensions

問題

插入對象時應設置某些更改跟蹤字段,但在更新時不應設置。 我在以通用方式實現它時遇到了麻煩,可以為每個模型重用它。

我可以使用Dapper或DapperExtensions來指定一個字段應該包含在插入中,但是忽略了更新嗎?

我已經查看了各種屬性,例如ReadOnly和Ignore用於映射,但到目前為止,我發現的所有內容都是“始終包含”或“始終忽略”。 我希望這可以使用標准的Update()函數,而不需要專門的sproc,盡管我不確定是否可行。 我缺少任何漏洞或有用的裝飾者?

(注意:如果有一種方法可以將這個規范一直調到ITypeWithChangeTracking界面,那么主要的布朗尼點就會出現!)


編輯:

我沒有創建單獨的模型,而是調整了已經從ITypeWithChangeTracking設置更改跟蹤值的代碼,以便它可以識別未設置的值(null,DateTime.Min等)。 它已經檢查了記錄是新的還是以前存在的,所以如果1)記錄確實存在並且2)模型沒有設置更改跟蹤值,我就從現有記錄中獲取相關值。

正如我在評論中提到的,要做的就是為UPDATE創建單獨的類,該類不包含要為UPDATE忽略的屬性。 您可能不需要每次都創建單獨的類; 您可以重復使用View Model或類似功能。

其他解決方案是回到Dapper繞過Dapper Extensions。 有了這個,你現在有多種選擇,因為Dapper更靈活。 您可以選擇傳遞匿名對象或動態參數,僅更新要更新的屬性。

這里這里已經進行類似的討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM