관계 - .NET SDK
이 페이지의 내용
Realm을 사용하면 앱의 객체 유형 간의 명시적인 관계를 정의할 수 있습니다. 관계는 기본 데이터 유형 중 하나가 아닌 다른 Realm 객체를 참조하는 객체 속성입니다. 속성 유형을 다른 Realm 클래스로 설정하여 관계를 정의합니다.
중요
상속
모든 Realm 객체는 IRealmObject, IEmbeddedObject 또는 IAsymmetricObject 인터페이스에서 상속되며 partial
클래스로 선언되어야 합니다.
10.18.0 이전의 .NET SDK 버전에서는 객체는 RealmObject, EmbeddedObject 또는 AsymmetricObject 기본 클래스에서 파생됩니다. Realm 모델 정의에 대한 이 접근 방식은 계속 지원되지만 null 허용 여부 주석 과 같은 새로운 기능은 포함되지 않습니다. 향후 SDK 릴리스에서는 기본 클래스가 더 이상 사용되지 않습니다. 새로 작성하는 모든 클래스에 인터페이스를 사용해야 하며 기존 클래스의 마이그레이션을 고려해야 합니다.
관계는 영역의 다른 객체를 직접 참조하는 것입니다. 즉, 관계형 데이터베이스에서처럼 관계를 정의하기 위해 브리지 테이블이나 명시적 조인이 필요하지 않습니다. 대신 관계를 정의하는 속성을 읽고 작성하여 관련 객체에 액세스할 수 있습니다. 영역은 읽기 작업이 들어오는 대로 느리게 실행되므로 관계를 쿼리하는 것은 일반 속성을 읽는 것과 마찬가지로 성능이 뛰어납니다.
관계 속성 정의
객체 간 관계에는 다음 세 가지 주요 유형이 있습니다.
일대일 관계
대일 관계는 객체가 특정 방식으로 하나 이상의 다른 객체와 관련되지 않음을 의미합니다. 유형이 관련 Realm 객체 유형인 속성을 지정하여 객체 스키마에서 객체 유형에 대한 대일 관계를 정의합니다.
예시
애플리케이션은 다음 객체 스키마를 사용하여 dog
속성에 개를 포함시킴으로써 개 한 마리를 소유할 수도 있고 소유하지 않을 수도 있음을 나타낼 수 있습니다:
public partial class Person : IRealmObject { [ ] [ ] public ObjectId Id { get; set; } public string Name { get; set; } public DateTimeOffset Birthdate { get; set; } public Dog? Dog { get; set; } } public partial class Dog : IRealmObject { [ ] [ ] public ObjectId Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Breed { get; set; } = String.Empty; }
직접 관계를 쿼리하려면 LINQ 구문을 사용할 수 있습니다. 일대일 관계를 쿼리하는 방법은 다음 예시를 참조하세요.
var fidosPerson = realm.All<Person>().FirstOrDefault(p => p.Dog == dog);
To-Many 관계
대다 관계는 객체가 특정 방식으로 여러 객체와 관련되어 있음을 의미합니다. 유형이 관련 Realm 객체 유형의 IList<T>
인 속성을 지정하여 객체 유형에 대한 대다 관계를 정의합니다. 게터만 있는 IList<T>
를 정의합니다. Realm은 속성에 처음 액세스할 때 컬렉션 인스턴스를 생성하므로 생성자에서 초기화할 필요가 없습니다.
// To add items to the IList<T>: var person = new Person(); person.Dogs.Add(new Dog { Name = "Caleb", Age = 7, Breed = "mutt" });
예시
애플리케이션은 다음 객체 스키마를 사용하여 dog
속성에 개를 포함하여 개인이 여러 마리의 개를 소유할 수 있음을 나타낼 수 있습니다.
public partial class Person : IRealmObject { [ ] [ ] public ObjectId Id { get; set; } public string Name { get; set; } public DateTimeOffset Birthdate { get; set; } public IList<Dog> Dogs { get; } } public partial class Dog : IRealmObject { [ ] [ ] public ObjectId Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Breed { get; set; } = String.Empty; }
사람과 개의 다대다 관계를 확인하려면 사람에 대해 쿼리하여 해당 개인의 개를 가져옵니다.
var katieAndHerDogs = realm.All<Person>(). Where(p => p.Name == "Katie") .FirstOrDefault();
역관계
역 관계는 정의된 대일 또는 대다 관계에서 해당 객체를 참조하는 다른 모든 객체에 객체를 다시 연결합니다. 관계 정의는 단방향이므로 객체 모델의 속성을 역관계로 명시적으로 정의해야 합니다.
예를 들어, "사용자에게 많은 항목이 있음"이라는 대다 관계는 "항목이 한 명의 사용자에게 속함"이라는 역관계를 자동으로 생성하지 않습니다. 객체 모델에서 역관계를 지정하지 않으면 별도의 쿼리를 실행하여 특정 항목에 할당된 사용자를 조회해야 합니다.
역관계를 정의하려면 객체 모델에서 관계의 소스 유형이 T
인 게터 전용 IQueryable<T>
속성을 정의한 다음, 이 속성에 [Backlink(sourceProperty)] 특성을 추가합니다(여기서 "sourceProperty"은 관계의 반대편에 있는 속성의 이름입니다). 다음 예는 "사용자에게 많은 항목이 있음" 시나리오를 사용하여 이 작업을 수행하는 방법을 보여 줍니다.
public partial class User : IRealmObject { [ ] [ ] public ObjectId Id { get; set; } = ObjectId.GenerateNewId(); public string Name { get; set; } [ ] public IQueryable<Item> Items { get; } } public partial class Item : IRealmObject { [ ] [ ] public ObjectId Id { get; set; } = ObjectId.GenerateNewId(); public string Text { get; set; } public User? Assignee { get; set; } }
이 예에서는 다음 사항에 유의하세요.
Item 객체의
Assignee
속성은 사용자 객체입니다.User 객체의
Items
속성은 관계를 반전시키고Assignee
속성에 이 특정 사용자를 포함하는 모든 Item 객체를 참조합니다.
그러면 Item 컬렉션을 쿼리하여 특정 사용자에게 할당된 모든 항목을 가져올 수 있습니다.
역관계를 쿼리하려면 Linq를 사용할 수 없습니다. 대신 문자열 술어를 전달합니다. 다음 예시는 "oscillator" 단어가 포함된 아이템을 보유한 모든 사용자를 찾는 방법을 보여줍니다.
var oscillatorAssignees = realm.All<User>() .Filter("Items.Text CONTAINS 'oscillator'").ToList(); foreach (User u in oscillatorAssignees) { Console.WriteLine(u.Name); }
요약
관계는 객체가 동일하거나 다른 객체 유형의 다른 객체를 참조할 수 있도록 하는 객체 속성입니다.
관계는 직접 참조입니다. 어떤 유형의 조인도 작성하지 않고도 관계 속성을 통해 관련 객체에 직접 액세스할 수 있습니다.
Realm은 대일, 대다 및 역관계를 지원합니다.