У меня есть два объекта GiftBasket и Gift
GiftBasket.cs
public class GiftBasket:EntityData
{
public string MerchantId { get; set; }
public string UserId { get; set; }
public string Source { get; set; }
public bool IsRedeemed { get; set; }
public Gift Gift { get; set; }
}
Gift.cs
public class Gift: EntityData
{
public int Value { get; set; }
public string Type { get; set; }
}
Я пытаюсь вставить новую GiftBasket в базу данных
Мой код на стороне клиента
Manager.cs
public async Task InsertGiftBasketAsync(GiftBasket giftBasket)
{
try
{
await giftBasketTable.InsertAsync(giftBasket);
}
catch (MobileServiceInvalidOperationException msioe)
{
Debug.WriteLine("Invalid sync operation: {0}", new[] { msioe.Message });
}
catch (Exception e)
{
Debug.WriteLine("Sync error: {0}", new[] { e.Message });
}
}
Мой код на моей странице:
GiftBasket giftBasket = new GiftBasket
{
Id = Guid.NewGuid().ToString(),
MerchantId = Wallet.MerchantId,
UserId = Wallet.UserId,
Gift = Gifts.ElementAt(2).Gift,
Source = "Scratch",
IsRedeemed = false
};
await manager.InsertGiftBasketAsync(giftBasket);
Когда я пытаюсь это сделать, используя мойя получаю эту ошибку:
[0:] Invalid sync operation: The request could not be completed. (Internal Server Error)
Когда я пытаюсь добавить новый объект вручную с помощью Почтальона, я получаю эту ошибку:
"message": "The operation failed with the following error: 'Cannot insert the value NULL into column 'Gift_Id', table 'nojoom_db.dbo.GiftBaskets'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated.'."
Что я делаю неправильно?Если я отредактировал свою модель GiftBasket, удалил связь с Gift и сделал ее так:
public string Gift_Id { get; set; }
, вставка работает нормально, но я жертвую получением связанных данных для подарка за один вызов API.
Обратите внимание, что GiftBasket - это новая запись в базе данных, но Gift внутри нее уже находится в базе данных в таблице подарков, я не пытаюсь вставить обе новые.
Обновление
Я изменил свои Модели на следующие:
public class GiftBasket:EntityData
{
public string MerchantId { get; set; }
public string UserId { get; set; }
public string Source { get; set; }
public bool IsRedeemed { get; set; }
public string GiftId { get; set; }
public virtual Gift Gift { get; set; }
}
и
public class Gift: EntityData
{
public Gift()
{
GiftBaskets = new List<GiftBasket>();
}
public int Value { get; set; }
public string Type { get; set; }
public virtual ICollection<GiftBasket> GiftBaskets { get; set; }
}
, что означает, что я реализовал отношения Один ко многим, что имеет смысл, потому что в одной подарочной корзине много подарков.
Но что, если бы я хотел отношений один на один?это как реализовать?
public class GiftBasket:EntityData
{
public string MerchantId { get; set; }
public string UserId { get; set; }
public string Source { get; set; }
public bool IsRedeemed { get; set; }
public string GiftId { get; set; }
public virtual Gift Gift { get; set; }
}
public class Gift: EntityData
{
public int Value { get; set; }
public string Type { get; set; }
public virtual GiftBasket GiftBasket { get; set; }
}
когда я делаю это, я получаю эту ошибку после вызова GET
"Unable to determine the principal end of an association between the types '****.DataObjects.GiftBasket' and '****.DataObjects.Gift'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations."
когда я добавляю [ForeignKey("GiftId")]
в подарочную корзину, я получаю эту ошибку
"The property 'GiftId' cannot be configured as a navigation property. The property must be a valid entity type and the property should have a non-abstract getter and setter. For collection properties the type must implement ICollection<T> where T is a valid entity type."