У меня проблемы со ссылками на некоторые свойства из моего объекта рецепта (который ссылается на объект InventoryItem (или ингредиент)). Во-первых, вот классы.
public class InventoryItem
{
[PrimaryKey]
public int ID { get; set; }
public string Name { get; set; }
public string Size { get; set; }
public string Stock { get; set; }
}
public class Recipe
{
[PrimaryKey]
public int ID { get; set; }
public string Name { get; set; }
[OneToOne]
public InventoryItem Ingredient { get; set; }
}
Далее, это код, который создает новый рецепт и присваивает свойству Ingredient значение инвентаризации. (instanceItem уже был создан и правильно устанавливает каждое свойство для ингредиента.)
Recipe recipe = new Recipe()
{
ID = (maxPK == null ? 1 : maxPK.ID + 1),
Name = nameEntry.Text,
Ingredient = inventoryItem
};
Наконец, здесь я просто хотел проверить, что этот ингредиент рецепта был установлен правильно, поэтому я проверяю и recipe.Ingredient. Имя действительно всплывает правильно .
db.Insert(recipe);
await DisplayAlert(null, recipe.Name + " - " + recipe.Ingredient.Name + " saved!", "okay.");
await Navigation.PopAsync();
Теперь о проблеме ... Во-первых, я отправляю выбранный / указанный рецепт в качестве ссылки, когда открываю новый ViewRecipePage. Указанный рецепт выбирается из коллекции ViewView всех рецептов.
private async void checkRecipe_Clicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new ViewRecipePage(recipe));
}
Затем на ViewRecipePage я хочу просмотреть различные свойства этого рецепта, включая, конечно, ингредиент.
try
{
Label recipeName = new Label();
recipeName.Text = recipe.Name;
grid.Children.Add(recipeName);
Label ingredient1Name = new Label();
ingredient1Name.Text = recipe.Ingredient.Name;
grid.Children.Add(ingredient1Name);
}catch(Exception e) { DisplayAlert(null, e.ToString(), "okay."); };
Recipe.Name отображается нормально, однако всякий раз, когда я пытаюсь каким-либо образом ссылаться на recipe.Ingredient.Name, я получаю сообщение об ошибке «System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта.»
Я уверен, что это что-то глупое, что я пропустил где-то по пути, но я не могу понять, почему это происходит, когда я проверял, что recipe.Ingredient.Name работает, когда я добавляю рецепт в базу данных ...
В любом случае, дайте мне знать, если есть больше информации, которую я могу предоставить! Спасибо, что посмотрели! Приветствия.
РЕДАКТИРОВАТЬ:
Новый класс рецептов с OneToMany для ингредиентов
public class Recipe
{
[PrimaryKey]
public int ID { get; set; }
public string Name { get; set; }
[OneToMany("ID")]
public List<InventoryItem> Ingredient { get; set; }
}
Теперь при добавлении нового рецепта я создаю список для ингредиентов, а затем устанавливаю Список ингредиентов для этого нового списка ...
inventoryItem = (InventoryItem)ingredient1Picker.SelectedItem;
List<InventoryItem> invList = new List<InventoryItem>();
invList.Add(inventoryItem);
Recipe recipe = new Recipe()
{
ID = (maxPK == null ? 1 : maxPK.ID + 1),
Name = nameEntry.Text,
Ingredient = invList
};
Затем я вставляю в базу данных и проверяю, был ли установлен ингредиент - все это работает нормально.
db.Insert(recipe);
await DisplayAlert(null, recipe.Name + recipe.Ingredient[0].Name + " saved!", "okay.");
Однако, на мой «GetRecipesPage», я получаю коллекцию ViewView следующим образом:
collectionView.ItemsSource = db.GetAllWithChildren<Recipe>().OrderBy(x => x.Name).ToList();
Однако, когда я выбираю рецепт и перехожу к ViewRecipePage и пытаюсь отобразить список ингредиентов (я просто пытаюсь увидеть первый и единственный ингредиент в списке), я получаю ошибку Индекс был вне диапазона. То, что я предполагаю, означает, что список вообще не заполняется, даже после того, как я установил в списке ингредиентов рецепта список с ингредиентом в нем и проверил его.
try
{
Label recipeName = new Label();
recipeName.Text = recipe.Name;
grid.Children.Add(recipeName);
Label ingredient1Name = new Label();
ingredient1Name.Text = recipe.Ingredient[0].Name;
grid.Children.Add(ingredient1Name);
}catch(Exception e) { DisplayAlert(null, e.ToString(), "okay."); };