SQLite-Net Extensions의 개체 필드에 외래 키를 매핑하려면 어떻게해야합니까?

TomTom

컨텍스트 : 우리는 SQLite-Net Extensions로컬 데이터 캐싱에 Xamarin. iOS, Android 및 Windows Phone에 배포 할 계획입니다. 이러한 방식으로 저장하려는 시스템 전체 (모두 공통 인터페이스 구현)에 사용 된 기존 데이터 구조가 있습니다.

문제 코드 샘플에서 볼 수 있듯이 [ManyToOne]속성은 관계 필드를 나타내는 데 사용됩니다. 작동하지 않습니다. 온 바와 같이 의 Bitbucket 개발자 페이지[ForeignKey] 속성은 외래 키 관계를 지정하는 데 사용할 수 있습니다. 이것은 int. Id 필드의 속성을 복제하지 않고 이러한 관계를 지원하도록 구조를 쉽게 조정할 수 있습니까? 예를 들어 다음은 바람직하지 않습니다.

    [ForeignKey(typeof(Address))]
    public int AddressId { set; get; }

    [ManyToOne]
    public Address Address
    {
        set { address = value; }
        get { return address; }
    }

코드 샘플

using SQLite.Net.Attributes;
using SQLiteNetExtensions.Attributes;

namespace Data
{
    [Table("Client")]
    public class Client : IData
    {
        private int id = -1;
        private Address address = null;

        public Client() { }

        public Client(int id)
        {
            this.id = id;
        }

        [PrimaryKey, AutoIncrement, Column("_id")]
        public int Id
        {
            set { id = value; }
            get { return id; }
        }

        [ManyToOne]
        public Address Address
        {
            set { address = value; }
            get { return address; }
        }
    }

    [Table("Address")]
    public class Address : IIdentifiable
    {
        private int id = -1;
        private string someFields = "";

        public Address() { }

        public Address(int id)
        {
            this.id = id;
        }

        [PrimaryKey, AutoIncrement, Column("_id")]
        public int Id
        {
            set { id = value; }
            get { return id; }
        }

        public string SomeFields
        {
            set { someFields = value; }
            get { return someFields; }
        }
    }
}
redent84

SQLite-Net Extensions는 SQLite-Net보다 얇은 계층이며 저장소로 sqlite 데이터베이스를 사용합니다. 관계형 데이터베이스는 외래 키를 사용하여 관계를 저장하며 sqlite는이 측면에서 다르지 않습니다. 따라서 SQLite-Net 및 SQLite-Net Extensions는 관계 선언을 위해 외래 키 메커니즘도 사용합니다.

대안으로, ManyToMany관계가 작동 하는 것과 같은 방식으로 중간 테이블을 사용하여 관계를 저장할 수 있지만 끝 중 하나를 하나로 제한 할 수 있습니다 . 이렇게하면 ManyToMany 관계 및 중간 테이블을 사용하여 OneToMany, ManyToOne또는 OneToOne관계를 모방 할 수 있습니다. 예를 들면 :

[Table("Client")]
public class Client {

    [PrimaryKey, AutoIncrement, Column("_id")]
    public int Id { get; set; }

    [Ignore] // This property shouldn't be persisted
    public Address Address { get; set; }

    // This relationship is in fact a ManyToOne relationship,
    // but we model it as a ManyToMany to avoid adding foreign key to this entity
    [ManyToMany(typeof(AddressesClients))]
    public Address[] Addresses { 
        get { return Address != null ? new []{ Address } : Address; } 
        set { Address = value.FirstOrDefault(); }
    }
}

[Table("Address")]
public class Address
{
    [PrimaryKey, AutoIncrement, Column("_id")]
    public int Id { get; set; }

    public string SomeFields { get; set; }

    [ManyToMany(typeof(AddressesClients), ReadOnly = true)]
    public List<Client> Clients { get; set; }
}

// Intermediate table that defines the relationship between Address and Client
class AddressesClients {
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [ForeignKey(typeof(Client))]
    public int ClientId { get; set; }

    [ForeignKey(typeof(Address))]
    public int AddressId { get; set; }
}

물론 이것은 약간의 성능 저하를 가져옵니다.

PrimaryKey경우 지원되는 모든 유형을 사용할 수 있으며 반대의 ForeignKey경우 정확히 동일한 유형을 사용해야합니다 . 즉 Guid, 기본 키로 사용 하는 경우 해당 클래스 가리키는 외래 키 Guid이어야합니다 . 데모 프로젝트에서 우리는 이미 사용하고있는 int(가장 확대됨)을, string심지어 UUID.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

두 개의 jquery 객체를 하나로 래핑하려면 어떻게해야합니까?

분류에서Dev

외래 키로 연결된 3 개 이상의 테이블에서 데이터를 쿼리하려면 어떻게해야합니까?

분류에서Dev

API (ASP.NET)에 2 개의 객체를 보내려면 어떻게해야합니까?

분류에서Dev

JSON.net을 사용하여 C #의 JSON 파일에서 키와 개체를 가져 오려면 어떻게해야합니까?

분류에서Dev

일련의 요소에 대한 외래 키 조회를 수행하려면 어떻게해야합니까?

분류에서Dev

C #의 클래스에서 특정 유형의 개체를 찾으려면 어떻게해야합니까?

분류에서Dev

VB.NET-linq에 사용자 지정 메서드를 클래스 개체에 추가하려면 어떻게해야합니까?

분류에서Dev

dict 키를 목록에있는 개체의 속성에 연결하려면 어떻게해야합니까?

분류에서Dev

PyGame에서 2 개 이상의 이미지를 드래그하려면 어떻게해야합니까?

분류에서Dev

개체 모델의 일부를 Entity Framework 및 SQL Server의 XML 열에 매핑하려면 어떻게합니까?

분류에서Dev

.net 코어의 큰 JSON 개체에서 하나의 속성을 얻으려면 어떻게해야합니까?

분류에서Dev

WordPress의 자체 플러그인 아래에 사용자 정의 텍스트 필드를 추가하려면 어떻게해야합니까?

분류에서Dev

API의 URL 매개 변수에 와일드 카드를 사용하려면 어떻게해야합니까?

분류에서Dev

API의 URL 매개 변수에 와일드 카드를 사용하려면 어떻게해야합니까?

분류에서Dev

외래 키로 다른 테이블의 열에 액세스하려면 어떻게해야합니까?

분류에서Dev

클래스에서 (* .h) 대신 (* .cpp)에 구조체를 정의하려면 어떻게해야합니까?

분류에서Dev

개체의 한 필드 값을 알고있는 경우 배열에서 개체를 제거하려면 어떻게해야합니까?

분류에서Dev

JavaScript를 사용하여 위 / 아래 키에서 스크롤해야하는 개체를 선택하려면 어떻게해야합니까?

분류에서Dev

Epicor 외부의 Epicor10 비즈니스 개체에서 UD 필드에 액세스하려면 어떻게해야합니까?

분류에서Dev

C ++에서 기본 클래스의 필드 용도를 변경하려면 어떻게해야합니까?

분류에서Dev

내 양식의 모든 필드에 클래스를 추가하려면 어떻게해야합니까?

분류에서Dev

벡터에 두 개의 개체를 하나의 요소로 추가하려면 어떻게해야합니까?

분류에서Dev

벡터에 두 개의 개체를 하나의 요소로 추가하려면 어떻게해야합니까?

분류에서Dev

두 개의 다른 메인 클래스를 동시에 실행하려면 어떻게해야합니까?

분류에서Dev

중복을 키에 매핑하고 키를 Pandas 데이터 프레임의 중복에 매핑하려면 어떻게해야합니까?

분류에서Dev

ASP.NET BoilerPlate : DbContext의 개체를 응용 프로그램 서비스에 삽입하려면 어떻게해야합니까?

분류에서Dev

RealmDB 결과 객체를 SwiftUI 목록에 올바르게 매핑하려면 어떻게해야합니까?

분류에서Dev

노드 js의 RSA 공개 키에서 SKI를 생성하려면 어떻게해야합니까?

분류에서Dev

install () 메소드의 매개 변수로 키 값을 제공하려면 어떻게해야합니까?

Related 관련 기사

  1. 1

    두 개의 jquery 객체를 하나로 래핑하려면 어떻게해야합니까?

  2. 2

    외래 키로 연결된 3 개 이상의 테이블에서 데이터를 쿼리하려면 어떻게해야합니까?

  3. 3

    API (ASP.NET)에 2 개의 객체를 보내려면 어떻게해야합니까?

  4. 4

    JSON.net을 사용하여 C #의 JSON 파일에서 키와 개체를 가져 오려면 어떻게해야합니까?

  5. 5

    일련의 요소에 대한 외래 키 조회를 수행하려면 어떻게해야합니까?

  6. 6

    C #의 클래스에서 특정 유형의 개체를 찾으려면 어떻게해야합니까?

  7. 7

    VB.NET-linq에 사용자 지정 메서드를 클래스 개체에 추가하려면 어떻게해야합니까?

  8. 8

    dict 키를 목록에있는 개체의 속성에 연결하려면 어떻게해야합니까?

  9. 9

    PyGame에서 2 개 이상의 이미지를 드래그하려면 어떻게해야합니까?

  10. 10

    개체 모델의 일부를 Entity Framework 및 SQL Server의 XML 열에 매핑하려면 어떻게합니까?

  11. 11

    .net 코어의 큰 JSON 개체에서 하나의 속성을 얻으려면 어떻게해야합니까?

  12. 12

    WordPress의 자체 플러그인 아래에 사용자 정의 텍스트 필드를 추가하려면 어떻게해야합니까?

  13. 13

    API의 URL 매개 변수에 와일드 카드를 사용하려면 어떻게해야합니까?

  14. 14

    API의 URL 매개 변수에 와일드 카드를 사용하려면 어떻게해야합니까?

  15. 15

    외래 키로 다른 테이블의 열에 액세스하려면 어떻게해야합니까?

  16. 16

    클래스에서 (* .h) 대신 (* .cpp)에 구조체를 정의하려면 어떻게해야합니까?

  17. 17

    개체의 한 필드 값을 알고있는 경우 배열에서 개체를 제거하려면 어떻게해야합니까?

  18. 18

    JavaScript를 사용하여 위 / 아래 키에서 스크롤해야하는 개체를 선택하려면 어떻게해야합니까?

  19. 19

    Epicor 외부의 Epicor10 비즈니스 개체에서 UD 필드에 액세스하려면 어떻게해야합니까?

  20. 20

    C ++에서 기본 클래스의 필드 용도를 변경하려면 어떻게해야합니까?

  21. 21

    내 양식의 모든 필드에 클래스를 추가하려면 어떻게해야합니까?

  22. 22

    벡터에 두 개의 개체를 하나의 요소로 추가하려면 어떻게해야합니까?

  23. 23

    벡터에 두 개의 개체를 하나의 요소로 추가하려면 어떻게해야합니까?

  24. 24

    두 개의 다른 메인 클래스를 동시에 실행하려면 어떻게해야합니까?

  25. 25

    중복을 키에 매핑하고 키를 Pandas 데이터 프레임의 중복에 매핑하려면 어떻게해야합니까?

  26. 26

    ASP.NET BoilerPlate : DbContext의 개체를 응용 프로그램 서비스에 삽입하려면 어떻게해야합니까?

  27. 27

    RealmDB 결과 객체를 SwiftUI 목록에 올바르게 매핑하려면 어떻게해야합니까?

  28. 28

    노드 js의 RSA 공개 키에서 SKI를 생성하려면 어떻게해야합니까?

  29. 29

    install () 메소드의 매개 변수로 키 값을 제공하려면 어떻게해야합니까?

뜨겁다태그

보관