在数据库优先的方法中,使用DbContext与Objectcontext定义数据注释



我使用实体框架的数据库优先方法,当我使用默认模板时,数据库表是使用ObjectContext映射的,所以我使用创建#partial classes&[MetadataType(typeof)来应用数据注释,但当我开始使用Dbcontext代码生成模板来映射数据库表时,我发现它将在我的模型区域中创建.tt文件夹,如果我发现,我可以将数据注释直接应用于.cs类本身,而无需像objectcontext情况下那样创建分部类。目前,数据注释运行良好,,但我的方法会给我带来我不知道的问题吗?我应该像过去使用Objectcontext那样创建分部类?BR

通常,您不应该编辑生成的代码,因为您所做的更改将在重新生成时被覆盖。这就是为什么大多数生成器都会发出分部类。

对于您的情况,最好的做法是在解决方案中创建一个带有另一个分部类声明的新文件。在该文件中,将MetadataType属性添加到类中,并将属性级验证属性添加到"buddy"类(属性中引用的类)中。这允许您在生成的属性上使用验证属性,并且如果您的模型/数据库发生更改,您仍然可以在不丢失模型类的情况下重新生成模型类。

例如,您的新文件可能看起来像:

[MetadataType(typeof(PersonMetadata))]
partial class Person
{
    // Add logic to the generated class in here.
    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }
}
class PersonMetadata
{
    // Add attributes to the generated properties in here.
    [Required]
    public string FirstName { get; set; }
}

创建相同的分部类来定义元数据,或者您可以简单地使用Entity Framework Power Tools对现有数据库进行逆向工程,从而获得POCO类。然后,您可以使用fluent API(您将看到它为您添加的验证),而不是数据注释来为您提供服务器端验证。

如果你想要客户端,那么你仍然可以将它们应用到你的模型中,因为它们不会在每次编译时重新生成。

然而,我建议您创建ViewModels,并使用AutoMapper在EF对象和视图模型之间进行映射。然后,您可以将注释直接应用于ViewModels。

我对您的情况的理解是,您将数据库优先风格反向工程为代码优先风格。如果你的上下文类继承自DbContext,那么你现在是代码优先的风格(除非有一些奇怪的混合,我不知道!)。

在代码优先中,为数据注释创建分部类实际上没有意义。

最新更新