0

私はUpdateAsyncを呼び出していますが、これらの値を渡していなくてもCreationTimeCreatorUserIdの列を更新しています。必要な列のみを更新する必要があります。CreationTimeとCreatorUserIdがUpdateAsyncで設定されているのはなぜですか?

{ 
    "testCode": "string", 
    "testName": "string", 
    "testDesc": "string", 
    "id": 1 
} 
public async Task UpdateTest(TestDetailsDTO input) 
{ 
    var classobj = ObjectMapper.Map<Test>(input); 
    await UpdateAsync(classobj); 
} 
public class TestDetailsDTO : FullAuditedEntityDto 
{ 
    public string TestCode { get; set; } 
    public string TestName { get; set; } 
    public string TestDesc { get; set; } 
} 

パラメータinputCreationTimeUpdateTestでのサービスメソッドを取得します。

public class Test : FullAuditedEntity 
{ 
    public const int NVarcharLength20 = 20; 
    public const int NVarcharLength30 = 30; 
    public const int NVarcharLength50 = 50; 

    [Required] 
    [MaxLength(NVarcharLength20)] 
    public virtual string TestCode { get; set; } 

    [Required] 
    [MaxLength(NVarcharLength30)] 
    public virtual string TestName { get; set; } 

    [MaxLength(NVarcharLength50)] 
    public virtual string TestDesc { get; set; } 
} 
+0

あなたは誤って 'UpdateAsync'メソッド、' TestDetailsDTO'クラス、 'Test'クラスを表示するのを忘れました。 –

答えて

0

電流の流れ:

  1. ObjectMapper.Map<Test>(input)は新しいTestオブジェクトを作成します。
  2. CreationTimeおよびCreatorUserIdは、default(DateTime)およびdefault(long?)である。
  3. これらの値はABPによって設定されます。

正しい流れ:

  1. は、データベースからclassobjを取得します。
  2. リストアCreationTimeおよびCreatorUserId
  3. 地図input~classobj

var classobj = repository.GetEntity(input.id); // 1 
input.CreationTime = classobj.CreationTime; // 2 
input.CreatorUserId = classobj.CreatorUserId; // 2 
ObjectMapper.Map(input, classobj);    // 3 

より良いデザイン:

  • ステップ2.

をスキップ→inputためFullAuditedEntityDtoを継承しないでください。それはうまくいっていますか?余分なGetEntityメソッドを呼び出すためです。

他の方法はattachです。トレードオフは、ObjectMapper.Mapではなく、明示的にマップする必要があることです。

+0

FullAuditedEntityDtoから継承しない場合は、他のすべての列を手動で渡す必要があります。そして、コードを変更する必要があります。更新要求に新しい列を追加したい場合 –

+0

それは別の方法で動作しています。余分なGetEntityメソッドを呼び出すためです。そして、私はすべてのテーブルに同じ変更を加えなければなりません。 –

+0

リンク上の例は明確ではありません。 –

関連する問題