Использование db.Find, когда есть составные первичные ключи и вы хотите использовать только один

0

У меня есть таблица, называемая учетными записями, которая приведена ниже:

[Key]
public int SiteID { get; set; }
[Key]
public long AccountID { get; set; }
public string Name { get; set; }
public string AccountCode { get; set; }
public string AccountType { get; set; }

Я пытаюсь использовать Entity Framework для отображения информации в таблице, где SiteID = 999999. Я пытаюсь использовать метод db.Find для отображения списка "учетных записей", где siteID = 999999.

Мой текущий код: index.cshtml

@Html.ActionLink("Mapping","ConfigureMapping", new { id = item.SiteID })

контроллер

 Account account = SiteDatabase.Accounts.Find(id);
 if (account == null)
 {
     return HttpNotFound();
 }
 return View(account);

Но это жалуется только на получение 1 из 2 первичных ключей: "Количество переданных первичных ключей должно соответствовать количеству значений первичного ключа, определенных на объекте".

Как мне это сделать???

Теги:
entity-framework
find
asp.net-mvc

2 ответа

2
Лучший ответ

Метод Find возвращает единственный объект, а не коллекцию. Если вам нужны все записи с SiteID = 999999, используйте метод Where чтобы получить отфильтрованный список.

Например,

List<Account> accountList = SiteDatabase.Accounts.Where(a=>a.SiteID==id).ToList();

где id имеет значение 999999 или какое-либо другое действительное значение идентификатора сайта

Если вам нужен один элемент, вы можете использовать FirstOrDefault в качестве альтернативного варианта Find

Account account = SiteDatabase.Accounts.FirstOrDefault(a=>a.SiteID==id);

Имейте в виду, что это вернет первое совпадение. Поэтому, если у вас есть 2 записи с одинаковым значением SiteID (но с другим AccountID), он просто вернет первый, который может и не быть тем, который вы ищете. Поэтому я предлагаю вам получить запись на основе уникального значения ключа (уникальные комбинации комбинаций клавиш). Возможно, вы также можете передать идентификатор учетной записи из ui и использовать ее (вместе с siteId) для получения отдельного объекта -correct по мере необходимости.

  • 0
    прогресс. теперь я прошёл мимо этой ошибки, но теперь получаю. Элемент модели, передаваемый в словарь, имеет тип 'System.Collections.Generic.List 1[MultiTenantWebApp.Models.Account]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [Xero.Api .Core.Model.Account]. Я пытался. AsEnumerable (), но не повезло
  • 0
    Это потому, что вы передаете список объектов MultiTenantWebApp.Models.Account , но он принимает список объектов Xero.Api.Core.Model.Account
Показать ещё 1 комментарий
0

Вам также нужно поставить другой ключ в find, сначала добавьте его в actionlink:

@Html.ActionLink("Mapping","ConfigureMapping", new { id = item.SiteID, accountID = item.AccountID })

Добавьте параметр в свой контроллер, а затем используйте его в поиске как таковой:

Account account = SiteDatabase.Accounts.Find(id, accountID);
  • 0
    это не будет работать, так как один siteID может иметь много идентификаторов accountID. Это передаст только один accountID, поэтому полный список нескольких аккаунтов не будет отображаться

Ещё вопросы

Сообщество Overcoder
Наверх
Меню