首次使用实体框架数据库时,如何使构造函数受到保护?
当我从数据库生成实体数据模型时,自动生成的类包含一个公共构造函数,
//------------------------------------------------------------------------------
// <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>
//------------------------------------------------------------------------------
namespace Domain.Models
{
using System;
using System.Collections.Generic;
public partial class MyClass
{
public MyClass()
{
我想要的是一个受保护的构造函数
public partial class MyClass
{
protected MyClass()
{
可以通过修改创建模型类的 t4 模板来执行此操作。在文件顶部附近查找此部分:
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile(entity.Name + ".cs");
BeginNamespace(code);
#>
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#=codeStringGenerator.EntityClassOpening(entity)#>
{
<#
var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity);
var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity);
var complexProperties = typeMapper.GetComplexProperties(entity);
if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any())
{
#>
public <#=code.Escape(entity)#>()
{
<#
并替换public <#=code.Escape(entity)#>()
的底线
protected <#=code.Escape(entity)#>()
此更改将为实体类型创建受保护的构造函数。在文件下方有一个类似的复杂类型构造,您可能还想修改该构造。
关于"更新"的一句话。如果从数据库更新模型,则不会覆盖这些更改。但是,如果更新 EF,则修改后的 t4 模板的问题是,当您想要使用新版本的模板时,必须再次执行此操作。
不能有受保护的模型构造函数不正确。可以 - 请参阅Gert提供的链接。http://msdn.microsoft.com/en-us/library/vstudio/dd468057%28v=vs.100%29.aspx感谢格特的指正。
因此,您可以通过 T4 更改。
你仍然认为这是解决问题的最佳方式吗?
您可以使用类似验证接口 IValidatableObject 的东西EF 将在保存操作期间调用该 EF 以验证数据是否正常。
请记住,在读取数据时,EF 会填充 poco 实例并将引用粘贴到上下文中。当您填写 POCO 实例时,您可以根据需要触发验证,ef 将在保存之前调用验证。 在谷歌上搜索这个话题。
例如
/// <summary>
/// Get called everytime a Validation is triggered on an object. EG MVC model check or EF save.
/// </summary>
public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
// Sample Implementation.
var validationResult = new List<ValidationResult>();
// a field cant be null or empty when condition X is true.
if ( SOME CONDTION that is true ) {
validationResult.Add(new ValidationResult(some field is required when...", new List<string>() {"FieldName"}));
}
return validationResult;
}