使用数据库第一种方法时覆盖或替换默认构造函数

时间:2016-01-28 19:43:04

标签: 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 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>();
    }
}

2 个答案:

答案 0 :(得分:6)

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

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

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

partial void Initialize();

现在在你自己的部分课程中:

partial class Product
{
    partial void Initialize()
    {
        this.Unit = 1; // or whatever.
    }
}

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

答案 1 :(得分:-1)

您可以看到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>();
    }

我应该提一下你的自定义类也应该在一个单独的文件中..我通常在与edmx文件相同的目录中创建一个Metadata文件夹,然后在那里添加我的部分类