Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 在数据库优先方法中使用DbContext与Objectcontext定义数据注释_Asp.net Mvc 3_Entity Framework_Dbcontext_Objectcontext - Fatal编程技术网

Asp.net mvc 3 在数据库优先方法中使用DbContext与Objectcontext定义数据注释

Asp.net mvc 3 在数据库优先方法中使用DbContext与Objectcontext定义数据注释,asp.net-mvc-3,entity-framework,dbcontext,objectcontext,Asp.net Mvc 3,Entity Framework,Dbcontext,Objectcontext,我在实体框架中使用数据库优先的方法,当我使用默认模板时,数据库表是使用ObjectContext映射的,因此我使用创建#分部类&[MetadataType(typeof)但当我开始使用Dbcontext代码生成模板映射数据库表时,我发现它将在我的模型区域中创建.tt文件夹,我发现我可以直接将数据注释应用到.cs类本身,而无需像objectcontext案例中那样创建分部类>. 目前,数据注释工作正常,但是我的方法会不会给我带来一些我不知道的问题,我应该像使用Objectcontext时那样创建

我在实体框架中使用数据库优先的方法,当我使用默认模板时,数据库表是使用ObjectContext映射的,因此我使用创建#分部类&[MetadataType(typeof)但当我开始使用Dbcontext代码生成模板映射数据库表时,我发现它将在我的模型区域中创建.tt文件夹,我发现我可以直接将数据注释应用到.cs类本身,而无需像objectcontext案例中那样创建分部类>. 目前,数据注释工作正常,但是我的方法会不会给我带来一些我不知道的问题,我应该像使用Objectcontext时那样创建分部类?
BR

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

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


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

我对您的情况的理解是,您将数据库优先样式反向工程为代码优先样式。如果您的上下文类继承自DBContextxt,您现在使用的是代码优先的样式(除非可能存在某种奇怪的混合,我不知道!)


在代码优先中,为数据注释创建分部类是毫无意义的。一般来说,您不应该编辑生成的代码,因为您所做的更改将在重新生成时被覆盖。这就是大多数生成器生成分部类的原因

针对您的情况的最佳做法是在解决方案中使用另一部分类声明创建一个新文件。在该文件中,将属性添加到类中,并将属性级验证属性添加到“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; }
}

我使用Dbcontext代码生成来映射现有的表,然后它创建包含我的表作为类的.tt文件夹;因此我可以将客户端数据注释应用于类本身。因此,我开始使用Db first APPACH,在映射之后,我将使用代码first APPACH。br但是如果我将数据注释直接应用于然后,如果我需要修改数据库并重新生成实体框架类,我将丢失这些类。BRDbContext不是代码优先工作流所独有的。您可以将EntityConnection传递到构造函数中,以从实体数据模型加载元数据,并从代码构建它。启用了。但是如果我应用数据对自动生成的分部类的注释如果我重新生成代码,那么我将丢失这些定义。@johnG更正,我提出的答案解决了这个问题。Mathieu假设您使用的是代码优先工作流,但您不是。实际上我注意到,.tt文件夹下的类默认为分部类,,这意味着,如果我想修改数据库并再次创建Dbcontext,那么所有的数据注释和帮助器方法都将被删除,那么我如何避免这种情况,以便即使再次创建Dbcontext,也不会删除所有的数据注释和帮助器方法?如果使用tt模板,则需要使用分部类uNL除非您修改tt模板,以便根据模型架构为您添加它们……或者像我提到的那样进行反向工程,但我无法创建相同的分部类来定义元数据,因为visual studio将引发一个错误,即这些类已经存在。您可以有5个同名分部类,这就是它们的要点。您可以创建另一个具有MetaDataType属性的分部类。然后创建第三个类,其中包含数据批注。请参阅:如果我使用ObjectContext,则您的点将有效,因为该模板将创建模型类,而不是DbContext模板案例中的分部类。因此,在DbContext模板中,如果我要添加任何帮助方法,请ds我应该在自动生成的分部类中执行此操作,因为我不能在metadatatype类中添加帮助器方法,因此通过这种方式,帮助器方法将添加到自动生成的代码中,这意味着如果我重新生成代码,我将丢失它。有任何建议。br
metadatatype
仅用于将属性添加到已存在的declared属性(因为部分属性是不可能的)。所有其他帮助程序逻辑都可以通过部分类的未生成文件部分直接添加到该类中。我认为如果我重新生成代码,.tt文件夹下的所有部分类都将被删除并重新创建,我不知道您的意思“分部类中未生成文件的部分。”,,你能解释一下吗。BR@johnG正确,您不应该修改.tt项下的文件。我建议您在解决方案中创建一个新文件,其中包含另一个
分部类
增量。(分部类的目的是将该类拆分为多个文件。)@约翰,我已经更新了答案,希望能让事情变得更清楚一点。