Android의 Room과 Windows의 EF Core 비교

배경.


최근에 나는 현장에서 기존 응용 프로그램(Android)의 Windows 버전을 새로 개발하는 일을 하고 있다.
여기에는 DB 라이브러리 룸에 적힌 코드를 EF Core로 교체하는 작업이 진행됐다.
각 도서관에 대한 이해를 깊게 할 수 있는 좋은 기회이기 때문에 필기로 남긴다.
또한 DB의 기본 및 라이브러리 가져오기 방법, 자세한 구문은 설명하지 않으므로 양해해 주십시오.

사용된 샘플


아래 사이트의 예를 샘플로 사용할 수 있도록 허락해 주십시오.
Room을 사용하여 로컬 데이터베이스에 데이터 저장

솔리드


우선 Room(Kotlin) 코드입니다.
@Entity(tableName = "user")
data class User(
    @PrimaryKey(autoGenerate = true)
    val uid: Int,
    @ColumnInfo(name = "first_name")
    val firstName: String?,
    @ColumnInfo(name = "last_name")
    val lastName: String?
)
다음은 EF Core(C#) 코드입니다.
[Table("user")]
public class User
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public int uid;
    [Column("first_name")]
    public string firstName;
    [Column("last_name")]
    public string lastName;
}
라이브러리마다 쓰는 방법은 다르지만 대체로 똑같아 보인다.
이 두 가지를 비교해 보면 항상 이해할 수 있을 것 같아서 각각 아래와 같다.
항목
Kotlin
C#
테이블 이름 정의@Entity(tableName = "テーブル名") [Table("テーブル名")]주 키워드@PrimaryKey [Key]자동 증가(autoGenerate = true) [DatabaseGenerated(DatabaseGeneratedOption.Identity)]열 이름 정의@ColumnInfo(name = "カラム名") [Column("カラム名")참고로 표 이름과 열 이름에 대해 특별한 정의가 없으면 모든 라이브러리에서 클래스 이름과 필드 이름을 직접 사용합니다.

DAO(Repository)


우선 Room(Kotlin) 코드입니다.
@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>
    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): List<User>
    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
        "last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User
    @Insert
    fun insertAll(vararg users: User)
    @Delete
    fun delete(user: User)
}
다음은 EF Core(C#) 코드입니다.
public class UserRepository
{
    private readonly AppDbContext _context;

    public UserRepository(AppDbContext context)
    {
        _context = context ?? throw new ArgumentNullException(nameof(context));
    }

    public async ValueTask<List<User>> GetAll()
    {
        return await _context.User.ToListAsync();
    }

    public async ValueTask<List<User>> LoadAllByIds(List<int> ids)
    {
        return await _context.User.Where(u => ids.Contains(u.uid)).ToListAsync();
    }

    public async ValueTask<User> FindByName(string first, string last)
    {
        return await _context.User.Where(u => u.firstName.Equals(first) && u.lastName.Equals(last)).SingleAsync();
    }

    public async ValueTask<int> Delete(User user)
    {
        _context.User.Remove(user);
        return await _context.SaveChangesAsync();
    }

    public async ValueTask<int> InsertAll(List<User> users)
    {
        _context.User.AddRange(users);
        return await _context.SaveChangesAsync();
    }
}
DAO와 관련하여 각 프로그램 라이브러리의 설치는 큰 차이가 있다.EF Core와 관련해서는 DAO나 리포지토리반을 만드는 방법이 좋은 것으로 조사됐다.EF Core는 O/R 매퍼이기 때문에 약간 그런 쓰기입니다.또 O/R 매핑기는 쓰기 습관이 강해 솔직히 사용하기 어렵고, 직접 검색어를 쓰는 룸은 사용하기 쉽다.

데이터베이스


우선 Room(Kotlin) 코드입니다.
@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}
val db = Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).build()
다음은 EF Core(C#) 코드입니다.
public class AppDbContext : DbContext
{
    public DbSet<User> User { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=database-name.db");
    }
}
글씨를 쓰는 방법은 다르지만 큰 차이가 없다.
다만, EF Core는 데이터베이스의 버전을 지정하지 않았습니다.창고 관리 잘 돼?읽어보시는 게 좋을 것 같아요.

총결산


DB 라이브러리의 룸과 EF Core를 비교했습니다.
원래 두 플랫폼이 완전히 다른 곳을 비교하는 것은 이상하지만 두 도서관을 동시에 공부하는 것은 재미있다.
그리고 현행 응용 프로그램(Android)의 Windows 버전을 만드는 것은 매우 귀중한 경험이라고 생각합니다.
같은 일을 한 사람이 있는지 없는지 참고해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기