5

假设我有一个数据库,其中包含 1 个名为Products. 因此,我通过 Db First 方法并在 VS 2012 中创建一个带有pluralize and singularize选项的 EF 模型。

因此,模型Product为我创建了一个实体,默认命名约定将该实体映射到dbo.Products表。

现在我想改变这种行为。事实上,我想创建一个自定义约定来将ProductModel实体映射到dbo.Products表。

这可能吗?!如果是这样,怎么做?

更新:我的目标是……

如您所知,每当您从数据库更新模型时,如果它导致模型发生更改,自动生成的实体将被覆盖。

另一方面,我想将数据注释属性添加到实体属性,以便我可以使用它们来塑造我的视图,并希望像下面的插入一样简单地使用我的 DbContext:

public ActionResult Create(Product product)
    {
        if (ModelState.IsValid)
        {
            db.Products.Add(product);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(product);
    }

问题是我的应用程序分析没有完成,并且数据库多次更改。所以,我需要从数据库中更新模型,然后,我的所有属性都将被删除。

所以我决定创建一个ProductModel类并将Product代码复制到它,并将视图作为视图模型传递给它。然后,当我想查询我的数据库时,我会得到一个异常,说dbo.ProductModels数据库中不存在该名称......

提前致谢

4

1 回答 1

3

默认情况下,数据库优先的方法总是将表名映射到同名的实体(可能是复数/单数)。目前 EF 中没有规定可以通过约定或工具对其进行调整。您可以更改/调整/自定义您的模型 - 但如果您重新生成它,这些更改就会丢失。我不知道有任何工具/脚本/黑客以某种方式“保留”这些更改并在从数据库重新生成模型后重新应用它们。

如果您需要扩展生成的我建议使用这些是部分类的事实 - 您可以在第二个物理文件中扩展生成的类:

把它写在一个单独的文件中,例如ProductExtension.cs

public partial class Product
{
   // add your custom methods etc. here
}

构成该类的各种文件将由 C# 编译器为您合并为一个类。

如果您需要向现有生成的类添加数据注释,则可以使用 MetadataType(..) 属性,如此 SO 问题及其答案所示

把它写在一个单独的文件中,例如ProductExtension.cs

[MetadataType(typeof(ProductMetaData))]
public partial class Product
{
}

然后在另一个文件中为您的产品类定义元数据/数据注释ProductMetadata.cs,如下所示:

public class ProductMetaData
{
    [Required]
    public int RequestId {get;set;}
    //...
}
于 2013-07-20T12:35:49.753 回答