实体部分类的数据注释

时间:2013-12-31 21:10:37

标签: c# asp.net-mvc-4 entity-framework-5

我重构了一个使用EF5 Database First的应用程序。应用程序使用元数据类将数据注释添加到实体属性。在重构之前,这些都有效。它们大多只是显示名称和数据格式。

示例:

    [MetadataType(typeof(QueryDetailsResultMetadata))]
    public partial class QueryDetailsResult : IPortfolio
    {
        public string Source { get { return "Local"; } }
    }

    public class QueryDetailsResultMetadata
    {
        //Fields from QueryDetailsResult requiring annotations

        [Display(Name = "Company Name")]
        public string SiteName { get; set; }

        [Display(Name = "Contact Telephone Number")]
        public string ContactTelNo { get; set; }
    }

在重构之前,部分类没有从接口继承,并且它没有非映射属性。然而,这些变化是必需的。这两者都不应该引起问题,因为两者都被证明是有效的解决方案。

界面如下所示

public interface IPortfolio
{
    int Id { get; set; }
    string SiteName { get; set; }
    string YearOfManufacture { get; set; }
    string Contact { get; set; }
    string ContactTelNo { get; set; }
    string Source { get;}
}

显示屏使用这样的属性

@Html.DisplayNameFor(model => model.Portfolio.ContactTelNo)

在运行时的View上,将显示属性名称而不是显示名称。有什么想法吗?我看不出任何理由让注释被打破

//修改

我尝试将注释移动到partial中的新非映射字段,并将其从元数据类中删除。要知道它是否有任何影响。没有。还要仔细检查edmx与部分类和元数据文件在同一个命名空间中。

有关检查或尝试的内容的任何想法?这方面没有取得多大成功,大多数谷歌搜索结果只是说使用已经存在的元数据类。

//第二次编辑

将注释从元数据类中移出并移到界面上就可以了。

1 个答案:

答案 0 :(得分:3)

DataAnnotation属性如何与接口混合有点令人困惑,因为:

但它的工作原理仅取决于视图中“容器”的类型,因此我们考虑以下类型:

public class QueryDetailsResult : IPortfolio
{
    public string SiteName { get; set; }
}

public interface IPortfolio
{
    string SiteName { get; set; }
}

因此,如果您的视图中有@Html.DisplayNameFor(model => model.Portfolio.SiteName)

  • ,您的模型类看起来像

    public class Model {
       public QueryDetailsResult Portfolio { get; set; }
    } 
    

    然后你需要将DisplayAttribute放在SiteName类的QueryDetailsResult属性上,因为MVC在model.Portfolio.SiteName表达式中查找“容器”类型{ {1}}

  • 但是如果您将模型类定义为

    QueryDetailsResult

    然后您需要将其放在public class Model { public IPortfolio Portfolio { get; set; } } 接口的SiteName属性上,因为您的“容器”类型是IPortfolio接口。