C# 使用数据库优先方法时重写或替换默认构造函数

C# 使用数据库优先方法时重写或替换默认构造函数,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,我们使用数据库优先的方法来创建MVC模型,这意味着框架会在主.cs文件中自动生成默认构造函数。但是,我有两个默认值要设置,问题是每次更新.edmx时,这个框架都会为此模型生成一个基本的.cs文件。是否有任何方法可以在类似于分部类的内容中重写此构造函数 示例 public partial class Product { // The framework will create this constructor any time a change to // the edmx fi

我们使用数据库优先的方法来创建MVC模型,这意味着框架会在主
.cs
文件中自动生成默认构造函数。但是,我有两个默认值要设置,问题是每次更新
.edmx
时,这个框架都会为此模型生成一个基本的.cs文件。是否有任何方法可以在类似于分部类的内容中重写此构造函数

示例

public partial class Product
{
    // The framework will create this constructor any time a change to 
    // the edmx file is made. This means any "custom" statements will 
    // be overridden and have to be re-entered
    public Product()
    {
        this.PageToProduct = new HashSet<PageToProduct>();
        this.ProductRates = new HashSet<ProductRates>();
        this.ProductToRider = new HashSet<ProductToRider>();
    }
}
公共部分类乘积
{
//框架将在对进行更改时创建此构造函数
//edmx文件已生成。这意味着将生成任何“自定义”语句
//将被覆盖,并且必须重新输入
公共产品()
{
this.PageToProduct=new HashSet();
this.ProductRates=new HashSet();
this.productOrider=new HashSet();
}
}

正如您所看到的,EF生成的类是
public**partial**class
。因此,创建一个新类,只需将代码添加到其中。只需确保它与EF生成的文件具有相同的名称空间

//EF Generated
public partial class Product
{
}

//Custom class
public partial class Product
{
    // The framework will create this constructor any time a change to 
    // the edmx file is made. This means any "custom" statements will 
    // be overridden and have to be re-entered
    public Product()
    {
        this.PageToProduct = new HashSet<PageToProduct>();
        this.ProductRates = new HashSet<ProductRates>();
        this.ProductToRider = new HashSet<ProductToRider>();
    }
//生成的EF
公共部分类积
{
}
//自定义类
公共部分类积
{
//框架将在对进行更改时创建此构造函数
//edmx文件已生成。这意味着将生成任何“自定义”语句
//将被覆盖,并且必须重新输入
公共产品()
{
this.PageToProduct=new HashSet();
this.ProductRates=new HashSet();
this.productOrider=new HashSet();
}

我可能应该提到,您的自定义类也应该在一个单独的文件中。我通常在与edmx文件相同的目录中创建一个元数据文件夹,并在其中添加我的分部类

您可以编辑生成类的t4模板,使其生成在无参数构造中调用的分部方法然后您可以在附带的分部类中实现此方法

编辑后,生成的代码应如下所示:

public Product()
{
    this.PageToProduct = new HashSet<PageToProduct>();
    this.ProductRates = new HashSet<ProductRates>();
    this.ProductToRider = new HashSet<ProductToRider>();
    Initialize();
}

partial void Initialize();

完全覆盖默认构造函数的优点是保留EF的初始化代码。

但是,只要对edmx文件进行更改,构造函数就会重新添加到EF生成的部分类中,并且自定义类中抛出一个错误,即已声明具有相同签名的
Memer
看看这个@NealR哦,我明白了。它没有在旧版本中向自动生成的类添加构造函数versions@NealR如果您不希望工具自动生成构造函数,Model.tt T4模板顶部有一个部分可以删除。如果您将默认值设置为v,它还会在构造函数中为您添加默认值DB中的值我相信,如果您的实体(在创建或更新
.EDMX
时由向导生成)存在,则此操作也不起作用包含导航属性。因为在这种情况下,向导已生成默认的无参数构造函数,并在同一命名空间中添加分部,然后在其中编写自己的构造函数,这将导致错误
。已定义的构造函数
。执行此路由将调用现有实体上的
初始化
。我希望我知道这个答案是大约3年前写的,但我遇到了这个问题,找不到T4模板的位置。我找到了2.tt文件(
MyProjectModel.Context.tt
MyProjectModel.tt
)在我的项目中,但我修改了它们,当我更新类时(在emdx中单击鼠标右键并从数据库更新),添加的代码没有生成。当保存edmx时,将执行模型生成(除非已明确禁用此功能)。您也可以通过右键单击解决方案资源管理器中的tt文件并选择“运行自定义工具”来触发它。
partial class Product
{
    partial void Initialize()
    {
        this.Unit = 1; // or whatever.
    }
}