2017-02-14 1 views
2

je les classes suivantes:extensions net sqlite InsertOrReplaceWithChildren pas l'insertion d'enfants champs clés étrangers

class A 
{ 
    [PrimaryKey] 
    public int A_ID { get; set; } 

    [OneToMany(CascadeOperations=CascadeOperation.All)] 
    public List<B> Children { get; set; } 
} 

class B 
{ 
    [PrimaryKey] 
    public int B_ID { get; set; } 

    [ForeignKey(typeof(C))] 
    public int C_ID { get; set; } 
} 

class C 
{ 
    [PrimaryKey] 
    public int C_ID { get; set; } 
} 

Quand j'ai une instance de A, avec des cas d'enfants de B, en faisant un db.InsertOrReplaceWithChildren(aInstance, recursive: true); ne provoque en effet A et il est les enfants B doivent être insérés dans la base de données, cependant chaque valeur de clé étrangère B.C_ID est toujours la valeur par défaut 0, bien qu'ils aient une valeur.

exemple:

A aInstance = new A(); 
aInstance.A_ID = 1; 

B bInstance = new B(); 
bInstance.B_ID = 1; 

C cInstance = new C(); 
cInstance.C_ID = 1; 

bInstance.C_ID = cInstance.C_ID; //assigning the many-to-one foreign key of B to C 
aInstance.Children.Add(bInstance); //assigning the one-to-many child record of A to B 

//do the insert 
db.InsertOrReplaceWithChildren(aInstance, recursive:true); 

Lorsque je sélectionne le dossier B:

B bDatabaseRecord = db.Get<B>(bRecord => bRecord.B_ID == bInstance.B_ID).First(); 
//bDatabaseRecord.C_ID is 0  <-- the problem 

Répondre

0

J'ai eu ce problème et il a été résolu en identifiant un objet de classe C en classe B (comme la clé étrangère objet) et marquant la relation comme ReadOnly = true. de sorte que le code doit être

class A 
{ 
    [PrimaryKey] 
    public int A_ID { get; set; } 

    [OneToMany(CascadeOperations=CascadeOperation.All)] 
    public List<B> Children { get; set; } 
} 

class B 
{ 
    [PrimaryKey] 
    public int B_ID { get; set; } 

    [OneToOne(ReadOnly=true)] 
    public C C_Obj { get; set; } 

    [ForeignKey(typeof(C))] 
    public int C_ID { get; set; } 
} 

class C 
{ 
    [PrimaryKey] 
    public int C_ID { get; set; } 
} 

J'espère que cette solution fonctionne pour vous :)