Auto=实体框架、ServiceStack OrmLite、PetaPoco等中的RTrim字符串



为Clarity编辑

上周我一直在研究ORM,并试图决定是否要麻烦他们。最终,似乎有十几位有价值的竞争者,其中大多数都很难区分。我最终选择了EF、OrmLite和PetaPoco这三位潜在的球员,他们看起来都很不错。

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

使用实体框架,我稍微研究了一下数据库优先和模型优先的设计过程,这些看起来可能会根据具体情况调整T4模板代码以生成适当的代码。这似乎是可行的,但如果有人已经这么做了,我不想重新发明轮子。我只想有解决这个问题的代码。

对于其他ORM,我可能会把它们拉到家里,弄清楚它们是如何工作的,并插入某种神奇的逻辑。

那么,有人建议ORM使用一个配置开关,可以自动对所有字符串进行右修剪吗?这将使数据库更容易使用,百分之百可以肯定的是,最后这些额外的空间永远不会有任何价值。

我认为这是一个很好的功能,所以我刚刚将其添加到ServiceStack.OrmLite中,您现在可以在其中为字符串添加自定义过滤器,例如:

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"));
}

它将出现在ServiceStack的下一个v4.0.19+NuGet版本中,该版本现在可在ServiceStack's MyGet Feed上获得。

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

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

但是。。。

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

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

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

最新更新