我可以用Fluent Api替换其中一些吗?

时间:2013-02-15 21:21:24

标签: entity-framework ef-code-first

假设我在一个类中有以下属性(我正在使用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可以完成多少这些注释?我知道必需可以和StringLength。但我不知道ErrorMessage,DataType和Display。

2 个答案:

答案 0 :(得分:4)

我采取观点:

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

b)您可以而且应该为POCO添加自定义注释或其他业务规则的检查。 如果感兴趣,请参阅样本bloew:

c)数据库特定注释属于EF流利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;
    }

答案 1 :(得分:3)

  

我知道必需可以和StringLength。

就是这样。

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

实体框架代码优先使用ModelState.IsValid属性来验证实体,但这实际上与MVC模型验证无关。如果通过配置使用Fluent API替换Required属性,您仍会影响实体框架,但是对于ASP.NET MVC,您只需删除该属性,即不再需要该属性进行MVC验证。 ASP.NET MVC不关心Entity Framework的Fluent API。

Required也是如此。 StringLengthErrorMessageDataType在实体框架中不起任何作用,既不作为属性也不作为Fluent API中的对应物。