加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

entity-framework – 如果EF 5,如何定义自定义命名约定

发布时间:2020-12-15 19:46:30 所属栏目:asp.Net 来源:网络整理
导读:假设我有一个名为Products的表的数据库.所以,我通过Db First方法在VS 2012中使用复数和单一化选项创建EF模型. 因此,模型为我创建了一个Product实体,默认命名约定将此实体映射到dbo.Products表. 现在我想改变这种行为.实际上我想创建一个自定义约定来将Produc
假设我有一个名为Products的表的数据库.所以,我通过Db First方法在VS 2012中使用复数和单一化选项创建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代码复制到它,并将视图作为视图模型传递给它.然后,当我想查询我的数据库时,我会得到一个异常,它说db中不存在dbo.ProductModels名称…

提前致谢

解决方法

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

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

将其写在单独的文件中,例如ProductExtension.cs:

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

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

如果需要向现有生成的类添加数据注释,可以使用MetadataType(..)属性as shown in this SO question and its answers:

将其写在单独的文件中,例如ProductExtension.cs:

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

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

public class ProductMetaData
{
    [Required]
    public int RequestId {get;set;}
    //...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读