Мобильное приложение Azure и Xamarin пытаются вставить связанные объекты 1: 1 в базу данных - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть два объекта 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."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...