2016-11-18 2 views
0

Ich suche Azure Mobile App und habe einen Testdienst und einen Client eingerichtet.

ich Setup haben die folgenden Einrichtungen Service-Seite:

public class Hotel : EntityData 
{ 
    public string Title { get; set; } 

    public virtual ICollection<Booking> Bookings { get; set; } 
} 

public class Booking : EntityData 
{ 
    public BookingStatus BookingStatus { get; set; } 

    [ForeignKey("PersonId")] 
    public virtual Person Person { get; set; } 

    [ForeignKey("HotelId")] 
    public virtual Hotel Hotel { get; set; } 

    public string PersonId { get; set; } 

    public string HotelId { get; set; } 
} 

public class Person : EntityData 
{ 
    public string Name { get; set; } 

    public virtual ICollection<Booking> Bookings { get; set; } 
} 

Und der Controller:

public class BookingController : TableController<Booking> 
{ 
    protected override void Initialize(HttpControllerContext controllerContext) 
    { 
     base.Initialize(controllerContext); 
     MobileServiceContext context = new MobileServiceContext(); 
     DomainManager = new EntityDomainManager<Booking>(context, Request); 
    } 

    // GET tables/Booking/48D68C86-6EA6-4C25-AA33-223FC9A27959 
    public SingleResult<Booking> GetBooking(string id) 
    { 
     return Lookup(id); 
    } 

    // GET tables/Booking 
    public IQueryable<Booking> GetAllBookings() 
    { 
     return Query(); 
    } 

    // PATCH tables/Booking/48D68C86-6EA6-4C25-AA33-223FC9A27959 
    public Task<Booking> PatchBooking(string id, Delta<Booking> patch) 
    { 
     return UpdateAsync(id, patch); 
    } 
} 

ich einige Standarddaten hinzugefügt haben CreateDatabaseIfNotExists<MobileServiceContext> verwenden und wenn ich beim Start und testen Sie die Web-API , die DB wird ausgefüllt und ich bin froh, dass die Schlüssel/Beziehungen richtig eingerichtet sind. Ich verwende nur die Code Ersten Namenskonvention (gemäß this tutorial)

Ich habe auch einen Test-Client mit den folgenden Einheiten erstellt:

public class Person 
{ 
    public string Id { get; set; } 
    public byte[] Version { get; set; } 

    public string Name { get; set; } 
    public virtual ICollection<Booking> Bookings { get; set; } 
} 

public class Booking 
{ 
    public string Id { get; set; } 
    public byte[] Version { get; set; } 

    public BookingStatus BookingStatus { get; set; } 
    public string PersonId { get; set; } 
    public string HotelId { get; set; }   
    public virtual Person Person { get; set; } 
    public virtual Hotel Hotel { get; set; } 
} 

public class Hotel 
{ 
    public string Id { get; set; } 
    public byte[] Version { get; set; } 

    public string Title { get; set; } 
    public virtual ICollection<Booking> Bookings { get; set; } 
} 

Und mit dieser Testlogik:

using (var client = new MobileServiceClient(m_Url, new ODataParameterHandler()) 
{ 
    client.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects; 
    client.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 

    var bookingTable = client.GetTable<Booking>(); 
    var bookings = await placementTable 
       .Where(p => p.BookingStatus == BookingStatus.Confirmed && p.PersonId == 10) 
       .WithParameters(new Dictionary<string, string> { { "expand", "Hotel" } }) 
       .ToListAsync(); 

    var aBooking = bookings[0];  
    aBooking.BookingStatus = BookingStatus.Cancelled; 

    await bookingTable.UpdateAsync(aBooking); 
} 

// Class to allow $expand= querystring value to be passed in. 
public class ODataParameterHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     UriBuilder builder = new UriBuilder(request.RequestUri); 

     builder.Query = builder.Query 
      .Replace("expand", "$expand") 
      .TrimStart('?'); 

     request.RequestUri = builder.Uri; 

     return await base.SendAsync(request, cancellationToken); 
    } 
} 

Die GET/ToListAsync funktioniert ok und ich bekomme das Kind Hotel Objekt an meine Booking angeschlossen. Allerdings schlägt die Update mit:

Der Betrieb aufgrund eines Konflikts fehlgeschlagen: ‚Verletzung von PRIMARY KEY-Einschränkung‚PK_dbo.Hotels‘. Kann keinen doppelten Schlüssel im Objekt 'dbo.Hotels' einfügen. Der doppelte Schlüsselwert ist (0e6e1bae-bd59-46ac-9630-a2b53dd04a90). \ R \ nDie Anweisung wurde beendet.

Aber warum um alles in der Welt versucht es mein Kind-Objekt wieder einzufügen? Erstens, ich habe es nicht anders, und zweitens, es hat ein Id, CreatedAt usw.

Ich kann keine ähnlichen Probleme in Bezug auf Azure Mobile-Apps finden, aber ich habe this SO Post regarding Entity Framework zu finden, aber die OP spricht über manuell die mit erstellt Kinder, also bin ich mir nicht sicher, ob es vollständig gilt, da ich die Kind-Entität aus der DB durch die TableController geholt habe.

+0

Ich bin nicht vertraut mit Azure Mobile, aber es sieht aus wie ein Problem mit den Entitäten, die nicht den richtigen "Entry.State" im Kontext haben, die Art von Problemen, die Sie in getrennten Szenarien erhalten. Es sieht so aus, als ob die am meisten gewählte Antwort in der SO-Post, die Sie verlinken, Ihr Problem beheben würde. Versuchen Sie, die Navigationseigenschaft 'aBooking.Hotel' auf "null" zu setzen, bevor Sie 'UpdateAsync' durchführen und nur den' HotelId'-Wert belassen. – Diana

Antwort

0

Azure Mobile Apps unterstützt keine Beziehungen. Sie stoßen auf eines der vielen Probleme, die damit einhergehen.

Wenn Sie Offline-Synchronisierung verwenden, dann zerlegen Sie die Tabellen, sodass die Verknüpfung weniger erforderlich ist, und synchronisieren Sie dann jede Tabelle einzeln.

Wenn Sie keine Offline-Synchronisierung verwenden, verwenden Sie eine benutzerdefinierte API, um die Änderung in die Datenbank zu übernehmen.

+0

Wirklich? Ich würde gerne sehen, wo das dokumentiert ist ... – OffHeGoes

+0

Ich möchte auch Ihre Aufmerksamkeit auf [diesen Microsoft Blog-Post über 1: n Beziehungen mit Mobile] (https://blogs.msdn.microsoft.com/) azuremobile/2014/06/18/insert-daten-mit-1n-beziehung-using-net-backend-azure-mobile-services /). – OffHeGoes

+0

In diesem Blogbeitrag geht es um Azure Mobile Services, den Vorgänger von Azure Mobile Apps.Wir haben niemals Beziehungen auf Azure Mobile Apps unterstützt. –

Verwandte Themen