【问题标题】:Data Annotations on Entity Partial Classes实体部分类的数据注释
【发布时间】:2014-01-03 05:37:59
【问题描述】:

我重构了一个使用 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)

在运行时的视图上,显示的是属性名称而不是显示名称。任何想法为什么?我看不出注释被破坏的任何原因

//编辑

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

对检查或尝试什么有什么想法?这方面没有太大的成功,大多数谷歌结果只是说使用已经到位的元数据类。

//第二次编辑

将注释从元数据类移到接口上就可以了。

【问题讨论】:

  • 问题出在你的新IPortfolio 界面...stackoverflow.com/questions/2652811/…
  • 我的印象是annotations on an interface 不起作用。我会试一试!谢谢
  • @nemesv 您能否将其重新添加为答案,以便我接受并为您分配积分。工作了一个款待。现在元数据类中甚至不需要注释。我想微软团队改变了主意,因为他们似乎反对在我上面发布的链接中实施它。非常感谢!

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


【解决方案1】:

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 表达式中查找“容器”类型QueryDetailsResult

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

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

    那么你需要把它放在IPortfolio接口的SiteName属性上,因为你的“容器”类型是IPortfolio接口。

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2021-10-01
    • 2019-11-03
    相关资源
    最近更新 更多