Ich habe eine Frage bezüglich der Aktualisierung bestehender Benutzer mit neuen Daten mithilfe von EntityFramework und Domänenmodellen. Oder eigentlich eher ein Problem.EntityFramework speichert keine neuen Daten für Entität
Wenn Sie einen neuen Auftrag an einen Benutzer hinzufügen, nach Order
zu einem OrderEntity
Zugabe es dann zu den UserEntity
Umwandeln und es in die Datenbank persistierenden wird die angegebene Reihenfolge nicht gespeichert.
So haben wir ein IUserModel
hier:
public interface IUser
{
int ID { get; }
List<IOrder> Orders { get; }
}
Und ein Unternehmen UserEntity
hier:
public class UserEntity
{
int ID { get; set; }
public List<OrderEntity> Orders { get; set; }
}
Wir haben ein Service PersistenceService
hier genannt:
public async Task<bool> UpdateInformation(IUser user)
{
using (var databaseContext = new DatabaseContext())
{
var userEntity = await database.Users.Include(u => u.Orders)
.FirstOrDefaultAsync(x => x.ID == user.ID);
userEntity.Orders = user.Orders.ToEntity(); // Extension (convert to entity)
databaseContext.Entry(userEntity).State
= EntityState.Modified; // Do we need this?
databaseContext.Entry(userEntity.Orders).State
= EntityState.Modified; // Do we need this?
await databaseContext.SaveChangesAsync();
}
}
Tabellen in der Datenbank so aussehen:
Orders User
-------- --------
int ID int ID
Money Price
int UserId -- foreign key to user that owns this order
Edit: An einem gewissen Punkt, wenn ein Benutzer einen Auftrag wir nennen dies schaffen machen:
public async void AddNewOrder(IOrder order)
{
IUser user = GetActiveUser(); // This just return an IUser
var persistenceService = GetPersistenceService(); // returns instance of persistence service
user.Orders.Add(order);
await persistenceService.UpdateInformation(user);
}
bearbeiten 2016.09.11: Nach mehr Debugging, es sieht wie die Zeile:
await persistenceService.UpdateInformation(user);
Wird nie zurückgegeben, dies ändert sich nicht, wenn Sie den Code ändern, um die Synchronisierung auszuführen auch nicht. Es ist also kein Threading-Problem.
Wie rufen Sie diese Methode? Sie müssen ihm Zeit geben, damit SaveChangesAsync funktioniert. Haben Sie versucht, UpdateInformation(). GetAwaiter(). GetResult()? –
Wie DavidG sagte, scheinen Sie lediglich eine Bestellung zu aktualisieren und nicht mit dem Benutzer zu verknüpfen. –
In Ordnung - also habe ich eine Bearbeitung gemacht, um zu zeigen, wie eine Bestellung zum Benutzer hinzugefügt wird, auch @RicardoPeres hilft nicht, das Problem wird nicht durch synchrone Arbeit gelöst. – Nicholas