2013-04-04 25 views
5

Mam projekt wykorzystujący ostatnią wersję EF CF z PostgreSQL i Npgsql.Integracja Npgsql z Entity Framework Code First

Mój model wygląda następująco:

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

i bazy danych/tabel/kolumn ma małe litery nazwiska jak:

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

Npgsql generuje polecenia SQL w cudzysłowie więc muszę używać adnotacje Danych ze względu na charakterystykę PostgreSQL, czarownica jest denerwująca. Nie chciałbym jednak używać nazw rozdzielanych kwotowań w bazie danych.

Czy istnieje sposób na skonfigurowanie Npgsql tak, aby nie zawierał cudzysłowów podczas generowania poleceń lub wymuszał na małych nazwach tabeli/kolumn w wygenerowanym SQL?

+0

Spójrz na to. –

+1

Witaj, Francisco, w EF6 można używać konwencji do małych nazw tabel i kolumn, zamiast tego dodaj atrybut do każdego, więc nie przejmuj się zbytnio tym pytaniem. :) –

+0

Działa konwencja kodów. Na szczęście, gdy Postgres widzi, że nazwa kolumny jest pisana małymi literami, ignoruje podwójne cudzysłowy (więc nadal otrzymujemy fałdowanie w momencie zapytania), ale dobrze byłoby wiedzieć, jak wyłączyć podwójne podsumowanie. – jhexp

Odpowiedz

8

Jeśli czegoś nie brakuje - chcesz uzyskać ogólny sposób: of changing the naming convention for tables?

EF6 posiada funkcję custom conventions - to nie jest jeszcze oficjalna wersja, ale czy to działa dla Ciebie, niektóre linki ...

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

W twoim przypadku trzeba by wdrożyć go do klasa/Type Przypuszczam - np (Niektóre pseudo kod) ...

1) wdrożyć IConfigurationConvention<Type, EntityTypeConfiguration> (można sprawdzić źródło EF dla EntityConventionBase)

2) W Apply - jak zmienić nazwy tabel są generowane poprzez konfigurację (ToTable()) - do coś .ToLowerCase()

3) dodać do konwencji ...

na przykład ...

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

można zobaczyć jeden przykład tutaj
http://blog.cincura.net/233167-custom-conventions-in-entity-framework-6-helping-firebird/

W przeciwnym razie, nie mam pojęcia o Npgsql/PostgreSQL - to wydaje się nieco „surowe”, aby mnie. Ale możesz sobie z tym poradzić po stronie EF.

+0

To dobry sposób na rozwiązanie mojego problemu! Jednak EF6 nie jest wydany jako stabilny i nie mogę używać tej wersji w mojej firmie. Ale i tak będę o tym pamiętać. –

+2

Znam @ MaxBündchen - ale to najlepsze, jak sądzę - brak jakichkolwiek rozwiązań po stronie PostgreSQL – NSGaga

+1

Hej, mam ten sam problem ... i EF6 jest już wyłączony! :RE – matrixugly

Powiązane problemy