EF Code First 重命名生成的 POCO 类中的属性

Posted

技术标签:

【中文标题】EF Code First 重命名生成的 POCO 类中的属性【英文标题】:EF Code First renaming of properties in generated POCO classes 【发布时间】:2016-04-08 12:53:16 【问题描述】:

我正在使用实体数据模型向导(数据库中的代码优先)来生成 dbcontext 和 POCO 类。不幸的是,我在一个非常旧的数据库上运行,所有数据库列的名称都是小写的,通常带有下划线,在 C# 中看起来像垃圾。如果代码生成器将属性 [Column("column_name")] 放在数据库中未大写的所有内容之上,或者如果有一种简单的方法可以告诉 Visual Studio查看文件并为所有还没有的小写属性添加该属性(甚至只是所有属性期间)。

我查看了一些 T4 的东西、反向 poco 生成器等。但是启动和运行它似乎与手动重命名属性一样耗时。当您在 VS 添加新项目窗口中选择“ADO.NET 实体数据模型”时运行的(实体数据模型向导)代码的源代码是否可以在任何地方使用,以便我可以从已经工作的东西开始?

或者有人知道一个史诗般的查找/替换将花费

public string n_addr1  get; set; 

并给予

[Column("n_addr1")]
public string N_addr1  get; set; 

不知道 n_addr1 叫什么,这意味着它必须匹配公共字符串和/或 get;设置;

【问题讨论】:

这是哪个版本的 Visual Studio?查找/替换正则表达式语法因版本而异。此外,可能无法更改大小写。实际编写一个快速控制台应用程序来运行您的源文件并进行更改可能更容易。 VS 2015 Pro 14.0.24720.00 更新 1 - 我认为你是对的,控制台应用程序可能是要走的路。 这是我可以通过查找和替换获得的最接近的结果。查找:public string [A-Za-z_\d]+ 替换:[Column("$1")] public string $1。它没有解决问题,也没有回车。祝您使用控制台应用程序好运。 【参考方案1】:

我做了类似的事情,我将发布我用来查找班级“名称”的代码。我进行了编辑,以便它与您传递的文件名一起使用。在我的一门课上测试过,这是有效的。

var fileName = @"YOUR FILE NAME";
StringBuilder builder = new StringBuilder();
using (StreamReader sr = new StreamReader(fileName))

    while (!sr.EndOfStream)
    
        var line = sr.ReadLine();
        var match = Regex.Match(line, @"\s?get;\s?set;\s?");
        if (match.Success)
        
            var split = Regex.Split(line, @"\s?get;\s?set;\s?");
            var declaration = split[0].Split(new[]  ' ' , StringSplitOptions.RemoveEmptyEntries);
            var last = declaration.Count();
            var name = declaration[last - 1];
            builder.AppendLine(string.Format("[Column(\"0\")]", name));
        
        builder.AppendLine(line);
    

【讨论】:

以上是关于EF Code First 重命名生成的 POCO 类中的属性的主要内容,如果未能解决你的问题,请参考以下文章

EF中的Code First

如何在 Code First 方法中自动生成 SDF

EntityFramework Reverse POCO Code First 生成器

EF 4.1 中使用 Code First 的 ComplexType 集合属性

EF,Code First - 如何在插入时设置自定义Guid标识值

EF之Code First设置主外键关系