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.
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