2013-04-04 157 views
5

整合Npgsql的我有使用EF CF与PostgreSQL和的Npgsql的最后一个版本的项目。与实体框架代码优先

我的模型看起来像:

[Table("mytable")] 
public class MyTable 
{ 
    [Column("id")] 
    public int Id { get; set; } 
    [Column("mycolumn")] 
    public string MyColumn { get; set; } 
} 

和数据库/表/列有小写名称类似:

CREATE TABLE mytable 
{ 
    id serial, 
    mycolumn character(50) 
} 

的Npgsql的产生与引号SQL命令,所以我必须使用数据注释由于PostgreSQL的特性,女巫很烦人。不过,我想不要在数据库中使用引号分隔名称。

有没有一种方法可以配置Npgsql在生成命令时生成命令或强制生成小写的表/列名称时不包括引号?

+0

我会看看那个。 – 2013-04-08 22:37:42

+1

嗨弗朗西斯科,在EF6中可以使用约定来小写表名和列名,而不是添加一个属性给每个人,所以不要太担心这个问题。 :) – 2013-04-15 14:42:45

+0

使用代码约定的工作。幸运的是,当Postgres发现列名全部小写时,它忽略了双引号(因此我们在查询时仍然可以折叠大小写),但是知道如何关闭双引号仍然很不错。 – jhexp 2015-05-02 17:27:48

回答

8

如果我不是失去了一些东西 - 你想要一些通用的方法of changing the naming convention for tables

的EF6有custom conventions功能 - 它仍然不是正式版,但它是否适合你,有些链接...

http://entityframework.codeplex.com/wikipage?title=Custom%20Conventions

在你的情况,你就必须实现它类/ Type我猜 - 如(一些伪代码)...

1)实现IConfigurationConvention<Type, EntityTypeConfiguration>(你可以检查EntityConventionBase的EF源)

2)在Apply - 更改表名是如何通过配置生成(ToTable()) - 到像.ToLowerCase()

3)添加到约定......

例如...

public class SmallCapsEntitiesConfigurationConvention 
    : IConfigurationConvention<Type, EntityTypeConfiguration> 
{ 
    public void Apply(Type memberInfo, Func<EntityTypeConfiguration> configuration) 
    { 
     configuration().ToTable(memberInfo.Name.ToLowerInvariant(), null); 
    } 
} 

你可以在这里看到
http://blog.cincura.net/233167-custom-conventions-in-entity-framework-6-helping-firebird/

一个例子,否则,我不知道有关Npgsql/PostgreSQL的 - 它的确显得有些“原始”给我。但是你可以在EF一边处理它。

+0

这是解决我的问题的好方法!然而,EF6没有被释放的稳定,我不能在我的公司使用这个版本。但是无论如何我都会记住这一点。 – 2013-04-04 17:19:41

+2

我知道@MaxBündchen - 但这就是我认为的最好 - 在PostgreSQL方面缺少任何解决方案 – NSGaga 2013-04-04 17:28:17

+1

嘿,我有同样的问题......而EF6现在不在了! :d – matrixugly 2016-01-20 17:01:36