【问题标题】:Can I replace some of this with the Fluent Api?我可以用 Fluent Api 替换其中的一些吗?
【发布时间】:2023-03-30 19:24:02
【问题描述】:

假设我在一个类中有以下属性(我使用 Code First):

[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }

我不想用这些注释来装饰我的 Password 属性。如果可能的话,我宁愿使用 Fluent Api。使用 Fluent Api 可以完成多少个注释?我知道Required可以和StringLength。但我不知道ErrorMessage、DataType 和Display。

【问题讨论】:

  • 您是否希望在模型验证期间强制执行这些?
  • @MattR - 否。在模型验证期间 Display 会有什么价值?
  • 啊,真的.. Fluent Validation .Net 和 code first fluent api 的混合可能会成功,但仍然需要一些额外的类

标签: entity-framework ef-code-first


【解决方案1】:

我采取观点:

a)用真正有用的业务约束来装饰 POCO。 MVC 和 EF 等将为您检查一些重要的约束。

b) 您可以并且应该向 POCO 添加对自定义注释或其他业务规则的检查。 如果有兴趣,请查看示例:

c) 特定于数据库的注释属于 EF fluent API。 如果它们是特定于数据库的,在我看来不属于 POCO。例如表名、模式、外键、关联映射、列重命名和忽略等。

d) 错误消息和显示文本属于模型视图。或者至少从下面的 POCO 示例中抽象出来。我知道人们不喜欢加倍努力,并且会使用 POCO 作为模型视图,并且喜欢简单的文本和错误消息处理。但我更喜欢多语言和可配置的完整错误消息/文本处理解决方案。在我看来,在 POCO 上粘贴文本并不是最好的解决方案。

显然样式和构建大小会影响选择,许多人会不同意 d) 我对此没有什么大问题。我拍摄了一张大图设计模式视图,并在有意义的地方进行了分离和抽象。

这里有一点 POCO 额外样本,没有注释,但它本来可以。我也看到了一些带有注释的好例子。这种错误风格可以在MVC中使用,在我看来比注释中的文本更好。

     public class POCODemo : IValidatableObject //various ways to trigger this. Some for free

    /// poco members .... bla bla


   //Support Business rules...
    public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var vResult = base.Validate(validationContext).ToList();


        if (Poco.property1 || poco.property is nasty or xyz issue)//psuedo code for your check

                var memberList = new List<string> { "PropertyName1" };
                var err = new ValidationResult("Some Text comes from your TEXTPOOL of choice that explains the error", memberList);
                vResult.Add(err);
           // }

        }

        return vResult;
    }

【讨论】:

    【解决方案2】:

    我知道Required可以和StringLength。

    仅此而已。

    请记住,相同的属性可以被不同的“框架”用于不同的目的。如果您在 ASP.NET MVC 的上下文中使用 - 例如 - Required 属性,它将用于 MVC 模型验证 - 在客户端由一些注入页面的 Javascript 或在服务器端设置 ModelState.IsValid

    Required 属性也被 Entity Framework Code-First 用于验证实体,但这实际上与 MVC 模型验证无关。如果使用 Fluent API 通过配置替换 Required 属性,您仍然会影响 Entity Framework,但对于 ASP.NET MVC,您只是删除了该属性,即 MVC 验证不再需要该属性。 ASP.NET MVC 不关心 Entity Framework 的 Fluent API。

    StringLength 也是如此。 ErrorMessageDataTypeDisplay 在 Entity Framework 中没有任何作用,既不是属性,也不是 Fluent API 中的对应物。

    【讨论】:

    • +1 例如,如果我有一个public string Email{ get; set; },那么您是否会建议使用[EmailAddress(ErrorMessage = "Not a valid email address"), MaxLength(256)] 之类的属性以及类似的流畅的最大长度映射来保持EF 的一致性?以前我认为保持我的 POCO 模型尽可能干净是可行的方法,但现在我认为使用一些属性进行验证会很好。
    • @GFoley83:一般我不会同时使用EF实体模型类作为MVC模型。对于 MVC,我使用 ViewModels 并在两者之间进行映射。在 ViewModels 上我放置了属性,对于 EF 模型我使用 Fluent API,但如果有人喜欢的话,属性也是可能的。但它仍然是另一个类的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2018-09-15
    • 2021-03-28
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多