Ali Majed HA Ответов: 1

Как присоединиться к entity framework


Привет

У меня есть 2 таблицы с именами "Пользователь"и " письмо". у каждого пользователя может быть много букв, поэтому отношение "один ко многим". Я хочу, чтобы при входе пользователя в систему он видел все письма, которые он получил в jqxGrid. Поэтому мне нужен формат Json для моих данных ресурсов, чтобы заполнить jqxGrid. Я написал коды ниже, но он показывает первую букву для каждого пользователя из-за "FirstorDefult".
1) Как я могу вернуть несколько записей ?
2) Как я могу преобразовать их в формат Json?

заранее спасибо

Что я уже пробовал:

в файле .js :
var source =
    {
        // fetching data to grid
        datatype: "json",
        datafields: [
                    { name: 'UserName', type: 'string' },
                    { name: 'Text', type: 'string' }
        ],
        localdata: response,
    };

    // Data Adapter for Generating data for Grid
    var dataAdapter = new $.jqx.dataAdapter(source, {
        downloadComplete: function (data, status, xhr) { },
        loadComplete: function (data) { },
        loadError: function (xhr, status, error) { }
    });



в контроллерах :

public string ShowUser()
        {
            using (Test02Entities _Test02Entities = new Test02Entities())
            {
                Join _Join = new Join();
                Letter _Letter = new Letter();
                Users _Users = _Test02Entities.Users.Where(c => c.ID==6).SingleOrDefault();
                if (_Users != null)
                {
                     _Letter = _Test02Entities.Letter.Where(c => c.UserID == _Users.ID).FirstOrDefault();
                    _Join.Text = _Letter.Text;
                    _Join.UserName = _Users.UserName;
                }
                return JsonConvert.SerializeObject(_Join);
            }
        }

        public partial class Join
        {
            public string UserName { get; set; }
            public string Text { get; set; }
        }

Ehsan Sajjad

так ли это asp.net mvc?

Ali Majed HA

это веб-api

F-ES Sitecore

Возьмите книгу по EF и пройдите ее или, по крайней мере, посмотрите онлайн-учебники. Связывание сущностей-это довольно базовый аспект EF, и он чрезвычайно хорошо документирован.

1 Ответов

Рейтинг:
2

Nathan Minier

То, как это будет работать, полностью зависит от вашего подхода Entity Framework.

Если это ваша база данных, и Вы сначала используете код, то самое лучшее, что вы можете сделать, - это определить свойства навигации в ваших классах моделей. Например:

public class Users
{
   ... 
   public virtual ICollection<Letter> Letters { get; set;}
}

public class Letter
{
   ...
   [ForeignKey("User")]
   public int UserId { get; set; }

   [JsonIgnore]
   public virtual Users User { get; set; }
}

public string ShowUser(int id)
{
   using (Test02Entities _Test02Entities = new Test02Entities())
   {
      var user = _Test02Entities.Users.Find(id);
                
      return JsonConvert.SerializeObject(_Join);
   }
}

Атрибут JsonIgnore позволит избежать проблемы циклической сериализации ссылок. Вы можете изменить это в зависимости от необходимости, но это выходит за рамки быстрого ответа.

Этот шаблон использует естественную реляционную природу данных в реляционной базе данных для обеспечения автоматических соединений и действительно является одним из лучших способов использования Entity Framework (IMO).

Кроме того, избегайте использования SingleOrDefault (), если это вообще возможно в EF, так как это приведет к перечислению всей таблицы. FirstOrDefault() остановит перечисление, когда условие будет выполнено, а Find () вытянет непосредственно ключ строки.

Существует праймер для навигационных свойств по адресу:
Отношения Entity Framework и свойства навигации[^].

Если вы сначала используете базу данных, вы можете сделать точно то же самое, добавив ассоциации в файл edmx. Этот подход не так прочен в моей области, но есть твердая ссылка на:
Отношения Entity Framework-EF Designer[^]


Dave Kreskowiak

Ваши высказывания по поводу метода singleordefault и метода firstordefault не совсем верно. Они оба переводятся в SQL-запросы, которые ограничивают возвращаемый набор данных из базы данных.

В случае запроса SingleOrDefault это выглядит следующим образом:

SELECT TOP (2) 
    [Extent1].columnName,
    ....
    FROM  [dbo].[someTable] AS [Extent1]
    WHERE expression

Это лишь немного отличается для первого дефолта:
SELECT TOP (1)
    [Extent1].columnName,
    ....
    FROM  [dbo].[someTable] AS [Extent1]
    WHERE expression

Nathan Minier

Я могу признать, что я был немного генералом с этим.

Однако в рассматриваемом случае запрос будет перечислять всю таблицу, поскольку целью является PK, как это было бы для любого уникального индекса.

Dave Kreskowiak

Мой пример-поиск PK из такого запроса:

using (var context = new DadContext())
{
    var result = context.Testtable.FirstOrDefault(tt => tt.Id == 9013);

    if (result == null)
    {
        ....
    }
}

Это не приводит к полному сканированию таблицы.

Nathan Minier

Это было бы потому, что вы используете FirstOrDefault. (Сверху(1))

Если вы используете SingleOrDefault (TOP(2)), База данных будет искать второе значение, которое она не найдет из-за уникального ограничения на PK, и поэтому будет искать всю таблицу.

Dave Kreskowiak

PK индексируются автоматически, так что нет, это не приводит к полному сканированию таблицы.

Nathan Minier

Я пойду вперед, надену дурацкую кепку и сяду в углу.

Dave Kreskowiak

:) Вы не должны этого делать. Это просто дискуссия, из которой все учатся.