Sto provando a eseguire un Upsert di un oggetto Advertisement
che contiene uno List<AdImage>
. Advertisement
contiene una chiave esterna corrispondente a User
. A user
può avere zero o più Advertisements
e uno Advertisement
ha uno o più AdImages
.Come specificare un ordine valido per le operazioni dipendenti quando si definiscono le relazioni di entità?
L'upsert riesce con il seguente: Si è verificato
un errore durante il salvataggio entità che non espongono stranieri chiave proprietà per le loro relazioni. La proprietà EntityEntries restituirà il valore restituendo null poiché non è possibile identificare una singola entità come origine dell'eccezione. La gestione delle eccezioni durante il salvataggio può essere semplificata con esponendo le proprietà delle chiavi esterne nei tipi di entità. Vedi InnerException per i dettagli.
Dove eccettuati interna è:
impossibile determinare un ordinamento valido per le operazioni di carico. Le dipendenze possono esistere a causa di vincoli di chiavi esterne, dei requisiti del modello o di valori generati dallo store.
Il advertisement
viene creata un'istanza molto semplicemente:
var ad = new Advertisement
{
AdImages = new List<AdImage>
{
new AdImage {Image = model.Image}
},
Message = model.Message,
Title = model.Title,
User = user,
};
_aAdAppService.UpsertAdvertisement(ad);
I soggetti in questione sono definiti come:
public class User : AbpUser<Tenant, User>
{ // AbpUser is a 3rd party class which defines Id as a primary key
public string AccessToken { get; set; }
public long UserId { get; set; }
public virtual List<Advertisement> Advertisements { get; set; }
}
public class Advertisement : Entity
{
[Key]
public long Id { get; set; }
public string Title { get; set; }
public string Message { get; set; }
public List<AdImage> AdImages { get; set; }
public virtual User User { get; set; }
}
public class AdImage : Entity
{
[Key]
public int Id { get; set; }
public string Image { get; set; }
public virtual Advertisement Advertisement { get; set; }
}
questo modo le relazioni sono definite:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(u => u.Advertisements)
.WithRequired(x => x.User);
modelBuilder.Entity<Advertisement>()
.HasMany(a => a.AdImages)
.WithRequired(x => x.Advertisement);
modelBuilder.Entity<AdImage>()
.HasRequired(x => x.Advertisement);
base.OnModelCreating(modelBuilder);
}
Che cosa significa l'errore sage mean? Non riesco a vedere come i miei rapporti siano definiti in modo errato. Come posso risolvere questo?
Basta guardarlo e questo può essere uno sparo nel buio. Hai provato a cambiare pubblico Elenco AdImages {get; set;} nel modello Advertisement a una proprietà di navigazione EF: public virtual ICollection AdImages {get; impostato;} ? –
JDupont
Hmm, non so se sarebbe di aiuto, ma prova a rimuovere 'modelBuilder.Entity() .HasRequired (x => x.Advertisement);', la relazione è già configurata correttamente dall'istruzione precedente, e questo potrebbe sovrascriverlo in modo errato dal momento che è incompleto. –