В моем Azure Mobile Service У меня есть класс контроллера UserController : TableController<User>
и в нем метод прибудет:Добавить в контроллере Azure Mobile Services
// GET tables/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
public SingleResult<User> GetUser(string id)
{
return Lookup(id);
}
Я хочу записывать каждый раз, когда пользователь доступа и так добавить простой тип модели:
public class UserVisit : Microsoft.WindowsAzure.Mobile.Service.EntityData
{
public string VisitingUser { get; set; }
public DateTime TimeOfVisit { get; set; }
}
и включает в себя свойство public DbSet<UserVisit> UserVisits { get; set; }
в моем VCollectAPIContext : DbContext
классе (и обновление базы данных с кодовой первой миграцией).
Чтобы добавить UserVisit в базу данных, когда идентификатор пользователя запрашивается меняю мой метод контроллера для
// GET tables/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
public async Task<SingleResult<User>> GetUser(string id)
{
var userVisit = new UserVisit { VisitingUser = id, TimeOfVisit = DateTime.UtcNow };
context.UserVisits.Add(userVisit);
await context.SaveChangesAsync();
return Lookup(id);
}
Но SaveChangesAsync
терпит неудачу с System.Data.Entity.Validation.DbEntityValidationException
. Копаясь в свойстве EntityValidationErrors
исключения, я обнаружил, что проблема в том, что «поле« Идентификатор »требуется».
Это немного странно. Поле Id является одним из свойств базового класса Microsoft.WindowsAzure.Mobile.Service.EntityData
, который я ожидал бы добавить автоматически при вставке. Независимо от того, что я могу добавить его и несколько свойств другого базового класса в таким образом:
// GET tables/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
public async Task<SingleResult<User>> GetUser(string id)
{
var userVisit = new UserVisit { Id = Guid.NewGuid().ToString(), Deleted = false, VisitingUser = id, TimeOfVisit = DateTime.UtcNow, CreatedAt = DateTimeOffset.Now };
context.UserVisits.Add(userVisit);
await context.SaveChangesAsync();
return Lookup(id);
}
На этот раз я получаю System.Data.Entity.Infrastructure.DbUpdateException
, потому что «не удается вставить значение NULL в столбец" CreatedAt». Это не было нулевым при вызове Add
. Таким образом, CreatedAt
был установлен на нуль где-то вне моего кода, а затем в результате не получается вставка!
Я также попытался создать переменную EntityDomainManager<UserVisit> userVisitDomainManager;
экземпляра в инициализаторе контроллера, а затем переписывание мой контроллер метод получить как
// GET tables/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
public async Task<SingleResult<User>> GetUser(string id)
{
var userVisit = new UserVisit { VisitingUser = id, TimeOfVisit = DateTime.UtcNow };
await userVisitDomainManager.InsertAsync(userVisit);
return Lookup(id);
}
Это терпит неудачу с таким же сообщением «Не удается вставить значение NULL в столбец«CreatedAt '"
Как выполнить, казалось бы, простую задачу вставки связанного элемента данных в мой метод контроллера?
Как выглядит таблица UserVisit в базе данных? Интересно, проблема в том, что мобильные службы SqlGenerator не запускались. Поведение, которое вы описываете context.UserVisits.Add(), очень странно! –
Попробуйте выполнить регистрацию созданных SQL-операторов: https://msdn.microsoft.com/en-us/data/dn469464.aspx#Log –