C# 实体部分类的数据注释
我重构了一个首先使用EF5数据库的应用程序。应用程序使用元数据类向实体属性添加数据注释。在重构之前,这些都是有效的。它们大多只是显示名称和数据格式 例如: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"; }
[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
属性上,因为MVC在SiteName
表达式中查找“container”类型,该表达式是model.Portfolio.SiteName
QueryDetailsResult
- 但是如果将模型类定义为
然后您需要将其放在public class Model { public IPortfolio Portfolio { get; set; } }
接口的IPortfolio
属性上,因为您的“容器”类型是SiteName
接口IPortfolio
IPortfolio
界面。。。我当时的印象是这不管用。我要试一试!Thanks@nemesv你能不能重新加上这个作为答案,这样我就可以接受它并给你打分。工作很愉快。现在元数据类中甚至不需要注释。我想微软团队改变了主意,因为他们似乎反对在我上面发布的链接中实现它。非常感谢!