模型视图控制器-跟踪我的数据实体类和它的MVC ViewModel等价类彼此匹配



我正在使用EntityFramework v4.1开发一个MVC3应用程序。根据最常见的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; }
}

这里的问题是,我不能在ICountry接口中使用ILanguageDefaultLanguage{get;set;},这会导致生成错误。即使我的两个"Country"类都有不同的"Language"类型化对象,它们是从相同的ILanguage接口派生的,它也会说"它没有匹配的返回类型"。它希望我将"public virtual ILanguage DefaultLanguage{get;set;}"改为。但是,当我这样说的时候,我的数据库没有被正确创建。因为,在我的DataContext中,我使用的是Language和Country实体,如DbSet<语言>数据库集<国家>。。。

我该怎么办??

我相信这就是您遇到的问题。有一些关于如何修复它的解释。

也就是说,界面可能有些过头了。我更喜欢使用AutoMapper在数据库类和视图模型之间进行映射。这将使用相同名称的两者之间的所有内容并自动处理,然后您可以根据需要添加/删除额外的内容。设置起来容易多了。

您可以使用接口的显式实现将其拼凑在一起。

// 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设置为除Language之外的ILanguage的实现,则会得到一个异常。考虑到这会很快失败,这是在开发早期发现错误的好方法。

相关内容

  • 没有找到相关文章

最新更新