C# 实体部分类的数据注释

C# 实体部分类的数据注释,c#,asp.net-mvc-4,entity-framework-5,C#,Asp.net Mvc 4,Entity Framework 5,我重构了一个首先使用EF5数据库的应用程序。应用程序使用元数据类向实体属性添加数据注释。在重构之前,这些都是有效的。它们大多只是显示名称和数据格式 例如: [MetadataType(typeof(QueryDetailsResultMetadata))] public partial class QueryDetailsResult : IPortfolio { public string Source { get { return "Local"; }

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

例如:

    [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)
显示器使用如下属性

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)
在运行时视图上,将显示属性名称,而不是显示名称。你知道为什么吗?我看不出注释被破坏的任何原因

//编辑

我尝试将注释移动到分部中新的未映射字段,并将其从元数据类中删除。看看有没有效果。没有一个还仔细检查了edmx是否与它所在的分部类和元数据文件位于同一命名空间中

关于检查或尝试什么有什么想法吗?在这方面没有太大的成功,大多数谷歌搜索结果只是说使用一个已经存在的元数据类

//第二版


将注释移出元数据类并移到接口上就成功了。

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
    放在
    QueryDetailsResult
    类的
    SiteName
    属性上,因为MVC在
    model.Portfolio.SiteName
    表达式中查找“container”类型,该表达式是
    QueryDetailsResult

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

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


问题在于新的
IPortfolio
界面。。。我当时的印象是这不管用。我要试一试!Thanks@nemesv你能不能重新加上这个作为答案,这样我就可以接受它并给你打分。工作很愉快。现在元数据类中甚至不需要注释。我想微软团队改变了主意,因为他们似乎反对在我上面发布的链接中实现它。非常感谢!