Entity Framework 4.1: данные из хранилища не отображаются через JSON - PullRequest
0 голосов
/ 26 июля 2011

Сначала я использую код Entity Framework 4.1 и ASP.NET MVC 3. На мой взгляд, у меня есть данные пользовательского интерфейса Yahoo (YUI). Я получаю данные (для заполнения сетки через JSON).

Поток получения данных:

Controller -> Service -> Repository

Моя настройка контекста:

public DbSet<Category> Categories { get; set; }

Оригинальный репозиторий:

public IEnumerable<Category> GetAll()
{
   return db.Categories.ToList();
}

Вызов этого метода хранилища из моего сервисного уровня:

public IEnumerable<Category> GetAll()
{
   return categoryRepository.GetAll();
}

Мой метод действия для извлечения данных и передачи их в таблицу данных YUI:

public ActionResult JsonCategoriesList()
{
   JsonEncapsulatorDto<Category> data = new JsonEncapsulatorDto<Category>
   {
      DataResultSet = categoryService.GetAll()
   };

   return Json(data, JsonRequestBehavior.AllowGet);
}

JsonEncapsulatorDto code:

public class JsonEncapsulatorDto<T>
{
   public IEnumerable<T> DataResultSet { get; set; }
}

Когда я использую его таким образом, в таблице данных возникает ошибка. Я не знаю, как просмотреть ошибку. Ничего не отображается Я отладил и увидел, что в DataResultSet есть счетчик 7. Поэтому я изменил репозиторий, чтобы использовать некоторые тестовые данные, и тогда это сработало. В чем разница, и как я могу получить его для отображения моих результатов?

Репозиторий с тестовыми данными:

public IEnumerable<Category> GetAll()
{
   List<Category> list = new List<Category>();
   list.Add(new Category { Name = "Brendan" });
   list.Add(new Category { Name = "Charlene" });

   return list;
   //return db.Categories.ToList();
}

Не уверен, что вы, ребята, хотите увидеть мою настройку категорий с данными:

<div id="dtCategories"></div>

<script type="text/javascript">

   YAHOO.util.Event.onDOMReady(function () {

      var yuiDataSource = YAHOO.util.DataSource;
      var yuiPaginator = YAHOO.widget.Paginator;
      var yuiDataTable = YAHOO.widget.DataTable;
      var dtCategoriesColumnDefs, dtCategoriesDataSource;
      var dtCategoriesConfigs, dtCategoriesDataTable;

      dtCategoriesColumnDefs = [
         { key: 'Name', label: 'Name' }
      ];

      dtCategoriesDataSource = new YAHOO.util.DataSource('@Url.RouteUrl      (Url.AdministrationCategoryJsonCategoriesList())');
      dtCategoriesDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
      dtCategoriesDataSource.responseSchema = {
         resultsList: 'DataResultSet',
         fields: [
            { key: 'Name' }
         ]
      };

      dtCategoriesDataTable = new YAHOO.widget.DataTable('dtCategories', dtCategoriesColumnDefs, dtCategoriesDataSource);

   });

</script>

UPDATE:

Категория категории:

public class Category
{
   public int Id { get; set; }
   public string Name { get; set; }
   public string Description { get; set; }
   public string MetaKeywords { get; set; }
   public string MetaDescription { get; set; }
   public bool IsActive { get; set; }
   public int? ParentCategoryId { get; set; }
   public virtual Category ParentCategory { get; set; }
   public virtual ICollection<Category> ChildCategories { get; set; }
}

Класс контекста:

public class PbeContext : DbContext
{
   public DbSet<Category> Categories { get; set; }
   public DbSet<Tutorial> Tutorials { get; set; }

   protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
   {
      dbModelBuilder.Entity<Category>()
         .HasOptional(c => c.ParentCategory)
         .WithMany(c => c.ChildCategories)
         .HasForeignKey(p => p.ParentCategoryId);
   }
}

ОБНОВЛЕНИЕ 2:

У меня есть другое представление, что он получает список объектов Product (без циклических ссылок) и заполняется нормально. Я отладил, чтобы посмотреть, как выглядят данные, когда они возвращаются И вот как объекты выглядели в списке:

Категория:

[0] [System.Data.Entity.DynamicProxies.Category_9E42BCEDDE8AA695F718BEBE2224E1D34291FCAF82F801F4995EEB8449479C93]
[1] [System.Data.Entity.DynamicProxies.Category_9E42BCEDDE8AA695F718BEBE2224E1D34291FCAF82F801F4995EEB8449479C93]
[2] [System.Data.Entity.DynamicProxies.Category_9E42BCEDDE8AA695F718BEBE2224E1D34291FCAF82F801F4995EEB8449479C93]

... и так далее ...

Продукты:

[0] = {MyProject.Core.DomainObjects.Product}
[1] = {MyProject.Core.DomainObjects.Product}
[2] = {MyProject.Core.DomainObjects.Product}

Может это из-за того, как данные возвращаются ??

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Не знаю, где ваша ошибка. Может быть, рекурсивная Category модель (обычно это происходит, когда вы не используете модели представлений и пытаетесь передать модели доменов EF представлению)? В вашем примере вам нужно только показать таблицу, содержащую один столбец, который является названием категории. Передача всего домена IEnumerable<Category> - это преступление. Может быть, отсутствуют скрипты? Может быть, это AdministrationCategoryJsonCategoriesList метод расширения?

Вот полный рабочий пример, который я написал для вас и который может помочь вам начать:

Модель:

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string MetaKeywords { get; set; }
    public string MetaDescription { get; set; }
    public bool IsActive { get; set; }
    public int? ParentCategoryId { get; set; }
    public virtual Category ParentCategory { get; set; }
    public virtual ICollection<Category> ChildCategories { get; set; }

    // Obviously this will be in your repository but for the purpose of
    // this demonstration let's hardcode some data
    public static IEnumerable<Category> GetAll()
    {
        List<Category> list = new List<Category>();
        list.Add(new Category { Name = "Brendan" });
        list.Add(new Category { Name = "Charlene" });
        return list;
    }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult JsonCategoriesList()
    {
        var data = Category.GetAll().Select(x => new
        {
            // We select only what we need for our view => the name
            // if you need something else, well, select it here
            Name = x.Name
        }).ToList();
        return Json(new { DataResultSet = data }, JsonRequestBehavior.AllowGet);
    }
}

Вид:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>YUI Test</title>
    <link type="text/css" rel="stylesheet" href="http://yui.yahooapis.com/2.9.0/build/datatable/assets/skins/sam/datatable.css">
</head>
<body>
    <div id="dtCategories"></div>

    <script src="http://yui.yahooapis.com/2.9.0/build/yahoo-dom-event/yahoo-dom-event.js"></script>
    <script src="http://yui.yahooapis.com/2.9.0/build/element/element-min.js"></script>
    <script src="http://yui.yahooapis.com/2.9.0/build/datasource/datasource-min.js"></script>
    <script src="http://yui.yahooapis.com/2.9.0/build/connection/connection-min.js"></script>
    <script src="http://yui.yahooapis.com/2.9.0/build/datatable/datatable-min.js"></script>


    <script type="text/javascript">
        YAHOO.util.Event.onDOMReady(function () {
            var yuiDataSource = YAHOO.util.DataSource;
            var yuiDataTable = YAHOO.widget.DataTable;
            var dtCategoriesColumnDefs, dtCategoriesDataSource;
            var dtCategoriesConfigs, dtCategoriesDataTable;

            dtCategoriesColumnDefs = [{ key: 'Name', label: 'Name'}];

            dtCategoriesDataSource = new YAHOO.util.DataSource('@Url.Action("JsonCategoriesList")');
            dtCategoriesDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
            dtCategoriesDataSource.responseSchema = {
                resultsList: 'DataResultSet',
                fields: [{ key: 'Name'}]
            };

            dtCategoriesDataTable = new YAHOO.widget.DataTable(
                'dtCategories',
                dtCategoriesColumnDefs,
                dtCategoriesDataSource
            );
        });
    </script>
</body>
</html>
0 голосов
/ 26 июля 2011

Пожалуйста, опубликуйте определение типа категории, чтобы увидеть, есть ли круговая ссылка. Это может помочь: Исключение Json и круговой ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...