Архитектура объектов - PullRequest
       44

Архитектура объектов

1 голос
/ 11 сентября 2011

Использование VS2010, .NET4.0, MVC3, EF4.1 Code-First

У меня есть эти объекты POCO:

public class XBLContent
{
    [Key]
    [StringLength(36, ErrorMessage="Must have 36 characters")]
    [Required(ErrorMessage="Must have a unique GUID")]
    public string GUID { get; set; }

    public int Price { get; set; }

    public float FileSize { get; set; }

    public virtual ICollection<XBLRegionalContent> RegionalInfo { get; set; }

    public string RelatedGameId { get; set; }
    [ForeignKey("RelatedGameId")]
    public virtual XBLContent RelatedGame { get; set; }
}

public class XBLRegionalContent
{
    [Key, Column(Order = 0)]
    public string ContentId { get; set; }
    [ForeignKey("ContentId")]
    public virtual XBLContent Content { get; set; }

    [Key, Column(Order = 1)]
    public string RegionId { get; set; }
    [ForeignKey("RegionId")]
    public virtual XBLRegion Region { get; set; }

    public string Name { get; set; }
}

public class XBLRegion
{
    [Key]
    [StringLength(5, ErrorMessage="ID must have 5 characters")]
    [Required]
    [RegularExpression(@"[a-z|A-Z]{2}-[A-Z|a-z]{2}")] 
    public string ID { get; set; }

    public string Country { get; set; }

    public string Language { get; set; }
}

Отношения:

  • Один XBLContent имеет много XBLRegionalContent;
  • Один XBLContent может быть связан с другим XBLContent (большинство из них нет);
  • Один XBLRegionalContent имеет один XBLContent и один XBLRegion;
  • Один XBLRegion имеет много XBLRegionalContent;

Контекст objetc действительно прост:

public class XBLContentContext : DbContext
{
    public DbSet<XBLContent> XBLContents { get; set; }
    public DbSet<XBLRegionalContent> XBLRegionalInfos { get; set; }
    public DbSet<XBLRegion> XBLRegion { get; set; }

    public XBLContentContext() : base("XBLToolsDB")
    {
    }
}

Я использую XBLContent в качестве основного бизнес-объекта, и, возможно, это не лучшая идея. Я думаю, что с архитектурой, которую я спроектировал, что-то не так, потому что у меня проблемы с отправкой информации в представление, фильтрацию, сортировку и т. Д.

Теперь я использую сетку Telerik, и когда я пытаюсь выполнить сортировку по полю свойств навигации, я получаю сообщение об ошибке «Нет свойства или поля». Возможно, мне не следует использовать XBLContent в качестве основного бизнес-объекта или создать ViewModel, содержащую все необходимые поля, и отправить его в View. Или создайте одну единственную сущность, которая разбивается на две таблицы EF (я не знаю, возможно ли это или как этого достичь).

Я просто падаван в .NET и мне нужен совет мастера-джедая.

Мне нужно содержимое, которое может иметь несколько переводов.

Как лучше всего достичь этой цели?

Ответы [ 3 ]

2 голосов
/ 11 сентября 2011

это должно исправить вашу проблему. http://weblogs.asp.net/manavi/ Отличный ресурс для начинающих, и я вижу, что вы использовали много аннотаций, так что немного беглого API сделает ваши концепции сильнее.

1 голос
/ 12 сентября 2011

Я предполагаю, что вы используете Telerik MVC Extensions здесь, но если вы используете другой продукт, пожалуйста, дайте мне знать, и я отвечу соответственно:)

Что касается сеткиКакую привязку вы используете?Если вы используете обычную привязку к серверу или ajax, то при привязке к навигационному свойству вы можете столкнуться с некоторыми проблемами, поскольку по умолчанию эти привязки работают только с примитивными (int, string и т. Д.) Типами.Тем не менее, существует такая вещь, как пользовательская привязка , которая позволяет вам получить полный контроль над подкачкой / сортировкой / фильтрацией.Я считаю, что это может объяснить, почему вы получаете эту ошибку, так как автоматические выражения LINQ не могут найти конкретное поле, которое вы ищете.Вот две демонстрации (которые имеют исходный код для WebForms и Razor ViewEngines), которые могут помочь с настройкой пользовательского связывания.Это просто немного больше работы, чем автоматическое связывание, но все равно должно работать (обратите внимание, что в этих примерах используется Razor):

Дополнительным преимуществом здесь является то, что вы можете управлять всем самостоятельно, что может быть весьма неплохо в более сложных ситуациях.Если вы уже используете пользовательскую привязку и / или ссылки там не помогают, дайте мне знать.Также может быть полезно иметь код для Telerik Grid.

1 голос
/ 11 сентября 2011

Я решил такие проблемы путем нормализации результатов, таких как:

from r in ctx.XBLContents
select new
{
   r.Guid,
   RelatedGuid = r.RelatedGame.Guid
};

По сути, создание анонимных классов, которые являются более денормализованными, помогло мне обойти эти виды проблем, где результаты также денормализуют эти навигационные свойства.

НТН.

...