Bla*_*ise 8 entity-framework entity-framework-4 asp.net-mvc-3 database-first
如果是模型优先,我们使用[MetadataType(typeof(ConceptMetadataSource))]附加MetadataSource文件,其中包含所有数据注释,如 [HiddenInput(DisplayValue = false)]或[Display(Name = "Title")].
例如:
[MetadataType(typeof(ConceptMetadataSource))]
public partial class Concept
...
Run Code Online (Sandbox Code Playgroud)
现在,我使用数据库优先方法,因为有一个现有的数据库.这次,实体类由edmx模型自动创建.在每个实体类的开头,下面都有注释行:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
由于一旦我们修改了数据库中的表,代码就会重新生成,每次重新生成实体类时都会删除数据注释.
谁能告诉我注释那些实体类的最佳方法是什么?谢谢.
小智 12
您所要做的就是创建另一个分部类并使用metadatatype属性.这是示例代码
//This is generated by EDMX
namespace DataLayer
{
using System;
using System.Collections.Generic;
public partial class Customer
{
public Customer()
{
this.CustomerAddresses = new HashSet<CustomerAddress>();
this.CustomerOrders = new HashSet<CustomerOrder>();
}
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailId { get; set; }
public Nullable<System.DateTime> DateOfBirth { get; set; }
public virtual ICollection<CustomerAddress> CustomerAddresses { get; set; }
public virtual ICollection<CustomerOrder> CustomerOrders { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
手动添加以下代码
namespace DataLayer
{
[MetadataType(typeof(CustomerMetaData))]
public partial class Customer
{
}
public class CustomerMetaData
{
[StringLength(10, ErrorMessage = "First name must be 25 characters or less in length.")]
[Required(ErrorMessage = "First name is required.")]
public String FirstName { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
好的,这是答案.
诀窍是,自动生成的类都是部分类.编译过程将组合所有具有相同名称的部分类.
如果我们已经public partial class Concept生成了DbContext,我们需要做的就是创建另一个开始的public partial class Concept.这个新的分部类可以在不同的文件夹中创建,但我们需要将其命名空间更新为与自动生成的分部类相同.
在这个新创建的分部类中,我们可以添加各种数据注释,例如
[Required(ErrorMesssage="This Field is required")]
Run Code Online (Sandbox Code Playgroud)
或者,我们甚至可以添加新属性
FullName {get {return string.Format("{0} {1}", FirstName, LastName);}}
Run Code Online (Sandbox Code Playgroud)
如果再次从数据库更新模型,则仅更新自动生成的部分类.那些新手动添加的包含我们的注释和其他操作的部分类将保持不变.