Отслеживание моего класса Data-Entity и его эквивалентного класса MVC-ViewModel соответствуют друг другу - PullRequest
2 голосов
/ 07 июня 2011

Я разрабатываю приложение MVC3 с EntityFramework v4.1. В соответствии с наиболее распространенными рекомендациями MVC, я должен отделить свои объекты слоя доступа к данным от моих объектов модели представления. Я не должен использовать объектные объекты в качестве моделей представления для хорошего дизайна проекта и по некоторым возможным причинам XSS, например, из соображений безопасности. Но так как при программировании довольно сложно отследить общие свойства между классом сущности и его эквивалентом модели представления, я решил использовать общие интерфейсы, из которых будут получены классы сущности и модели представления. Такие как:

public interface ICountry
{   
    int CountryId { get; set; }
    string CountryCode { get; set; }
    string CountryName { get; set; }
    string CountryLocalName { get; set; }
    ILanguage DefaultLanguage { get; set; }
}

...

/// entity class in my data access layer
public class Country : ICountry
{
    [Key(), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CountryId { get; set; }

    [Required(AllowEmptyStrings=false), MaxLength(6)]
    public string CountryCode { get; set; }

    [Required(AllowEmptyStrings = false), MaxLength(64)]
    public string CountryName { get; set; }

    [Required(AllowEmptyStrings = false), MaxLength(64)]
    public string CountryLocalName { get; set; }

    public string APropertyOnlyForDataEntity_001 { get; set; }
    public string APropertyOnlyForDataEntity_002 { get; set; }


    // this "Language" type is from data entity classes, derived from ILanguage
    public virtual Language DefaultLanguage { get; set; }
}

...

/// View Model class in my MVC application
public class Country : ICountry
{
    [Key(), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CountryId { get; set; }

    [Required(AllowEmptyStrings=false), MaxLength(6)]
    public string CountryCode { get; set; }

    [Required(AllowEmptyStrings = false), MaxLength(64)]
    public string CountryName { get; set; }

    [Required(AllowEmptyStrings = false), MaxLength(64)]
    public string CountryLocalName { get; set; }

    public string AnotherPropertyOnlyForViewModel_001 { get; set; }
    public string AnotherPropertyOnlyForViewModel_002 { get; set; }

    // this "Language" type is from view-model classes, derived from the same ILanguage
    public virtual Language DefaultLanguage { get; set; }
}

Проблема в том, что я не могу использовать ILanguage DefaultLanguage {get; задавать; } в интерфейсе ICountry , он выдает ошибку сборки. Даже если оба моих класса " Country " имеют разные типизированные объекты Language", которые получены из одного и того же интерфейса ILanguage , он говорит, что" у него нет соответствующий тип возврата ". Он ожидает, что я вместо этого добавлю " общедоступный виртуальный ILanguage DefaultLanguage {get; set;} ". Но когда я говорю об этом, моя база данных не создается должным образом. Потому что в моем DataContext я использую объекты Language и Country, такие как DbSet и DbSet ...

Что мне делать ??

Ответы [ 2 ]

4 голосов
/ 07 июня 2011

Я полагаю, что это проблема, с которой вы сталкиваетесь .Там есть какое-то объяснение того, как это исправить.

Это говорит о том, что интерфейс может быть излишним.Я предпочитаю сопоставлять классы базы данных и просматривать модели, используя AutoMapper .Это займет все между двумя с одинаковым именем и обработает его автоматически, затем вы можете добавлять / удалять дополнительные вещи по мере необходимости.Намного проще в настройке.

1 голос
/ 07 июня 2011

Вы можете собрать его вместе, используя явную реализацию интерфейса.

// this "Language" type is from view-model classes, derived from the same ILanguage
public Language DefaultLanguage { get; set; }

ILanguage ICountry.DefaultLanguage
{
    get { return this.DefaultLanguage; }
    set { this.DefaultLanguage = (Language)value; }
}

Это "заставит это работать", но, похоже, это неправильное использование языка. Кроме того, если какой-либо код устанавливает ICountry.DefaultLanguage для реализации ILanguage, отличной от Language, вы получите исключение. Учитывая, что это быстро не получится, это хороший способ найти ошибку на ранней стадии разработки.

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