Я разрабатываю приложение 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 ...
Что мне делать ??