gpt4 book ai didi

c# - 在 Code First 的情况下使用 MetadataType 强制执行验证是否有意义?

转载 作者:可可西里 更新时间:2023-11-01 08:09:59 25 4
gpt4 key购买 nike

我似乎理解了将 MetadataTypeAttribute 帮助到 Add Validation to the Model 背后的原因如果是 Database First因为我们希望避免下次从数据库生成模型时覆盖更改。

我注意到很少有人使用 MetadataType 定义验证,即使他们使用 Code First 也是如此。方法,并且它们的实体类不可能被某种自动生成的代码覆盖。

不直接将这些 DataAnnotations 应用于实际的实体类,而是将它们分成部分类定义,然后使用 MetadataType 进行链接是否有意义,即使在使用 Code First 时也是如此定义实体模型的方法?

public class MyEntity
{
[Required]
public string Name { get; set;}
}

对比

public partial class MyEntity
{
public string Name { get; set;}
}

[MetadataType(typeof(MyEntityMetadata))]
public partial class MyEntity
{
}

public class MyEntityMetadata
{
[Required]
public string Name { get; set;}
}

最佳答案

Does it make any sense to not apply these DataAnnotations on the actual Entity class directly and instead, separate these into partial class definitions and then link using MetadataType, even when using Code First approach to define Entity Model?

在大多数情况下,它没有意义,因为它涉及不必要和冗余的代码重复,只是为了将某些属性与属性相关联。

如果实体类模型是你用代码创建的,那是没有意义的。

如果它是使用您可以控制的某些自定义代码生成(如 T4 模板)创建的,它也没有意义,因为您可以自定义生成本身。

唯一有意义的情况是您无法控制实体类代码(例如,来自第 3 方库的类)。在这种情况下,您可以使用 AssociatedMetadataTypeTypeDescriptionProvider类将元数据与第 3 方类相关联。

例如,假设以下类来自另一个没有源代码的库:

public sealed class ExternalEntity
{
public string Name { get; set;}
}

然后你可以定义元数据类:

public class ExternalEntityMetadata
{
[Required]
public string Name { get; set;}
}

并使用 TypeDescriptor.AddProvider 将其与 ExternalEntity 相关联方法一次(在应用程序启动或其他过程中):

TypeDescriptor.AddProvider(new AssociatedMetadataTypeTypeDescriptionProvider(
typeof(ExternalEntity), typeof(ExternalEntityMetadata),
typeof(ExternalEntity));

关于c# - 在 Code First 的情况下使用 MetadataType 强制执行验证是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38940443/

25 4 0
文章推荐: c# - 从 IEnumerable 转换为 IEnumerable