現在の仕事は、Android版アプリのソースコードを読みながらWindows版アプリの開発を行っています。メンテナンスの都合上、Androidのコードに似せて欲しいとの要望だったので、可能な限りAndroidらしいコードで開発。チマチマ、仕事で得た知見を記事にしていきます。
それぞれのOS主要のフレームワークは下記の通り
Android・・・Room
Winodws・・Entity Framework Core
Entityクラス
Kotlinコード
@Entity(tableName = "members")
data class MemberDto(
@PrimaryKey
@ColumnInfo(name = "member_id")
val id : Int = 0,
val name : String = "",
)
C#コード
[Table("members")]
public class MemberEntity
{
[Column("member_id")]
[Key]
public int id {get; protected set;}
public string name {get; protected set;}
protected MemberEntity(int id, string name)
{
this.id = id;
this.name = name;
}
)
DataBaseクラス
kotlinコード
@Database{
entities = [
MemberDto::class
],
exportSchema = false
}
abstract class SampleDatebase : RoomDatabase()
{
abstract fun memberDto() : MemberDao
}
C#コード
public class GNDoohDbContext
{
public DbSet<MemberEntity> Members {get; set;}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){
optionsBuilder.UseSqlite("Data Source=sample.db");
optionsBuilder.UserLazyLoadingProxies();
base.OnConfiguring(optionsBuilder);
}
}
Data Access Objectsクラス
kotlinコード
@Dao
interface MemberDao{
@Query("SELETE * FROM members")
fun getAll(): List<ScheduleDto>
@Query("DELETE FROM sqlite_sequence WHERE name = 'members'")
fun resetIncrement(): Int
}
C#コード
FromSqlRawとExexuteSqlInterpolatedAsyncメソッドを使えば、Android側で実装済みのコードを再利用できるはず。
public class MemberDao
{
private readonly SampleDbContent _content;
public CreativeDto(SampleDbContent content)
{
_content = content;
}
public async Task<IReadOnlyList<MemberEntity>> GetAll()
{
return await context.Database.FromSqlRaw("SELECT * FROM dbo.members").ToListAsync();
}
public async Task<int> ResetIncrement()
{
return await _content.Database.ExexuteSqlInterpolatedAsync($"DELETE FROM sqlite_sequence WHERE name = 'members'");
}
}
参考文献
[Room](https://developer.android.com/training/data-storage/room?hl=ja)
[Entity Framework Core](https://docs.microsoft.com/ja-jp/ef/core/modeling/entity-properties?tabs=data-annotations)