实体框架数据库第一个受保护的构造函数



首次使用实体框架数据库时,如何使构造函数受到保护?

当我从数据库生成实体数据模型时,自动生成的类包含一个公共构造函数,

//------------------------------------------------------------------------------
// <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;
    }

相关内容

  • 没有找到相关文章

最新更新