2013-04-04 271 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