Entity framework Auto=实体框架、ServiceStack或MLite、PetaPoco等中的RTrim字符串

Entity framework Auto=实体框架、ServiceStack或MLite、PetaPoco等中的RTrim字符串,entity-framework,orm,frameworks,entity,Entity Framework,Orm,Frameworks,Entity,为清晰起见进行了编辑 上周我一直在研究ORMs,并试图决定是否要使用它们。最终,似乎有十几个有价值的竞争者,其中大多数很难区分。我最终确定了英孚、奥姆利特和佩塔波科的潜在三人组合,所有这些看起来都很不错 我一直在寻找的一个特性是,能够神奇地配置代码生成器,在生成的POCO中自动右键修剪所有字符串,而无需对DB进行任何更改。我有一个数据库,其中有数千条记录分布在数百个字段中,出于遗留原因,每个字符串字段的末尾都有一堆空格。这些需要从生成的POCO/实体中剥离出来,以使处理过程不那么难看,但我不能对

为清晰起见进行了编辑

上周我一直在研究ORMs,并试图决定是否要使用它们。最终,似乎有十几个有价值的竞争者,其中大多数很难区分。我最终确定了英孚、奥姆利特和佩塔波科的潜在三人组合,所有这些看起来都很不错

我一直在寻找的一个特性是,能够神奇地配置代码生成器,在生成的POCO中自动右键修剪所有字符串,而无需对DB进行任何更改。我有一个数据库,其中有数千条记录分布在数百个字段中,出于遗留原因,每个字符串字段的末尾都有一堆空格。这些需要从生成的POCO/实体中剥离出来,以使处理过程不那么难看,但我不能对DB进行任何更改(它不是我的),因此我想知道是否有简单的方法可以做到这一点

在Entity Framework中,我看了一下数据库优先和模型优先设计的过程,这些看起来像是您可以调整T4模板代码,以根据具体情况生成适当的代码。这似乎是可行的,但如果有人已经做了,我不想重新发明轮子。我只想有代码来解决这个问题

对于其他的orm,我可能会在家里把它们拉出来,弄清楚它们是如何工作的,然后插入某种逻辑,实现神奇的效果

那么,有人对ORM有什么建议吗?ORM有一个配置开关,可以自动右键修剪所有字符串?这将使数据库更易于使用,百分之百地确定最后的额外空间中没有任何价值。

使用实体框架(可能还有我个人不知道的PetaPoco),您应该能够修改T4模板并向实体添加只读属性,返回数据库相关属性的修剪值

public string Name
{
    get { return this.DbName.TrimEnd(); }
}
但是

  • 您必须找到一种仅针对字符串属性执行此操作的方法(我认为T4模板中可见的方法之一可以用于此操作,但我不确定)

  • 当更新发布时,您可能需要再次修改T4模板

  • 不能直接在LINQ to实体中使用只读属性,因为EF无法将它们转换为SQL。在调用
    AsEnumerable()
    后,您必须始终使用它们


    • 认为这是一个很好的功能,所以我刚刚添加了这一功能,您现在可以为字符串添加自定义过滤器,例如:

      OrmLiteConfig.StringFilter = s => s.TrimEnd();
      
      public class Poco
      {
          public string Name { get; set; }
      }
      
      using (var db = OpenDbConnection())
      {
          db.DropAndCreateTable<Poco>();
      
          db.Insert(new Poco { Name = "Value with trailing   " });
          var row = db.Select<Poco>().First();
      
          Assert.That(row.Name, Is.EqualTo("Value with trailing"));
      }
      
      OrmLiteConfig.StringFilter=s=>s.TrimEnd();
      公共类Poco
      {
      公共字符串名称{get;set;}
      }
      使用(var db=OpenDbConnection())
      {
      db.DropAndCreateTable();
      插入(新的Poco{Name=“带尾随“}的值);
      var row=db.Select().First();
      Assert.That(row.Name,Is.EqualTo(“带尾随的值”);
      }
      

      它将出现在ServiceStack的下一个v4.0.19+NuGet版本中,该版本现已在上提供。

      请参阅以下答案:。我会寻找一个修复数据库的解决方案:这是一个很好的建议,但在这种情况下我做不到。这是别人的数据库;(而且你不允许编辑数据?所有内容都是只读的?你能添加只读视图并映射到它们吗?是的,我故意以只读方式访问数据库。这是一个通过多种不同技术(3种ADO、2种ORM,甚至更多)写入的实时系统),而遗留系统总是在填充空间的情况下写入新数据。我可以通过在影子数据库中创建视图来完成这一切,或者通过手动滚动SQL来访问所有数据,但我希望避免这种情况。这是一种我可以尝试的方法。我实际上可能会先编写代码,所以我认为我应该能够做类似的事情,并创建一个Se还是换个方向吧。我会试试的。谢谢你的建议。该死,那太快了;)上周我一直在试着决定一个ORM,在OrmLite和EF之间来回跳跃。不管怎样,我倾向于使用奥姆利特,但我认为这是一个致命的功能,打破了骆驼的背部。出色的工作。我将下载它并在第一时间尝试。我在MyGet提要中没有看到SQL Server版本。你知道什么时候可以买到吗?谢谢。@Wadehatter所有的软件包都在那里,这是Perfecto-收到了,它工作得很好。它似乎是默认打开的,这对我来说很好。谢谢。哦,那是错的。我用一个实际上正确的DB字段进行了测试。得到了一个更典型的开关,开关的工作原理与广告一样。