대퍼 제어 날짜

dapper

문제

이 질문은 Dapper를 사용하여 제어 날짜 시간에 대한 정보를 제공하기위한 것입니다.

이러한 컨트롤은 데이터 저장소의 정보를 감사하고 특정 행이 생성 / 업데이트되었을 때 파악하는 데 사용됩니다. 저는 StackOverflow에서 GitHub의 프로젝트에 대한 정보를 찾을 수 없었습니다. 그래서이 게시물을 다른 사람들을 돕거나 미래의 도서관 확장을위한 핵심적인 원천이되고 싶습니다.

모든 답변, 리소스 또는 모범 사례가 인정 될 것입니다.

수락 된 답변

레일즈와 더퍼가 모두 사용하는 데이터베이스로 작업하고있는 경우를 만났습니다. Rails는 데이터베이스가 아닌 created_at 및 updated_at를 관리하고있었습니다. 그래서 .net 응용 프로그램을 사용하여 이러한 응용 프로그램을 관리하는 솔루션을 구현하고 이벤트와 같은 계층에서 추가 비즈니스 논리를 추가 할 수있는 기능을 제공해야했습니다.

여기에는 삽입과 업데이트를 위해 Dapper Simple Crud를 둘러싼 래퍼를 사용하여 어떻게 처리했는지에 대한 기본 예제가 포함되었습니다. 이 예제는 query, GET, Delete 등과 같이 dapper와 simplecrud에서 다른 중요한 메소드를 노출하는 것을 포함하지 않는다.

안전을 위해 모델 created_at 속성을 [Dapper.IgnoreUpdate] 속성으로 꾸미십시오.

[Table("examples")]
public partial class example
{
    [Key]
    public virtual int id { get; set; }
    [Required(AllowEmptyStrings = false)]
    [StringLength(36)]
    public virtual string name { get; set; }
    [Dapper.IgnoreUpdate]
    public virtual DateTime created_at { get; set; }
    public virtual DateTime updated_at { get; set; }
}

public class ExampleRepository : IExampleRepository
{
    private readonly IYourDapperWrapper db;

    public PartnerRepository(IYourDapperWrapper yourDapperWrapper){
        if (yourDapperWrapper == null) throw new ArgumentNullException(nameof(yourDapperWrapper));
        db = yourDapperWrapper;
    }

    public void Update(example exampleObj)
    {
      db.Update(exampleObj);
    }

    public example Create(example exampleObj)
    {
      var result = db.Insert(exampleObj);
      if (result.HasValue) exampleObj.id = result.value;
      return exampleObj;
    }
}

public class YourDapperWrapper : IYourDapperWrapper
{
    private IDbConnectionFactory db;

    public YourDapperWrapper(IDbConnectionFactory dbConnectionFactory){
      if (dbConnectionFactory == null) throw new ArgumentNullException(nameof(dbConnectionFactory));
      db = dbConnectionFactory;
    }

    public int Insert(object model, IDbTransaction transaction = null, int? commandTimeout = null)
    {
      DateUpdate(model, true);
      var results = Db.NewConnection().Insert(model, transaction, commandTimeout);
      if (!results.HasValue || results == 0) throw new DataException("Failed to insert object.");
      return results;
    }

    public int Update(object model, IDbTransaction transaction = null, int? commandTimeout = null)
    {
      DateUpdate(model, false);
      var results = Db.NewConnection().Update(model, transaction, commandTimeout);
      if (!results.HasValue || results == 0) throw new DataException("Failed to update object.");     
      return results;
    }

    private void DateUpdate(object model, bool isInsert)
    {
      model.GetType().GetProperty("updated_at")?.SetValue(model, DateTime.UtcNow, null);
      if (isInsert) model.GetType().GetProperty("created_at")?.SetValue(model, DateTime.UtcNow, null);
    }
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow