Pracuję nad połączeniem prostej aplikacji POC przy użyciu Fluent NHibernate, aby spróbować pokazać, że może ona zrobić wszystko, co jest obecnie w naszym ręcznym narzędziu dostępu do danych i wiele więcej. Jednym z niepokojących przypadków, o które martwi się mój szef, jest możliwość dostępu do wielu schematów w tej samej bazie danych w jednym zapytaniu. Do tej pory byłem w stanie pobierać dane z tabel w obu schematach, o ile zapytanie dotyka tylko jednego schematu naraz. Jeśli spróbuję wykonać polecenie, które będzie łączyć tabele z obu schematów, to rozwinie się.Łączenie dwóch nie-kluczowych pól
Na podstawie komunikatów o błędach, które widzę, nie uważam, że problem polega na łączeniu się schematów, ale raczej z tym, że dwa pola, które muszę dołączyć do tabel są niezwiązane z kluczem pola. Struktura dwóch tabeli jest mniej więcej tak:
Customer (in schema 1) -------- int CustomerId (Primary Key) string Name ...other fields Order (in schema 2) -------- int OrderId (primary key) string CustomerName ...other fields
pomocą SQL bezpośrednio mogę dołączyć na nazwę/pól CustomerName i uzyskać dane z obu tabel. Jednak przy użyciu NHibernate nadal otrzymuję "System.FormatException: wejściowy ciąg nie był w poprawnym formacie" podczas próby pobrania danych z tabeli zamówień i uwzględnienia danych z tabeli klienta. To prowadzi mnie do przekonania, że NHibernate próbuje dołączyć do pola CustomerName i pola CustomerId.
Wiem, jak polecić mu użycie pola CustomerName w moim mapowaniu zamówienia, ale nie mogę wymyślić sposobu, aby powiedzieć, aby dołączyć do pola Nazwa w tabeli klienta.
Moi Mappings wyglądać następująco:
public class CustomerMap : ClassMap<Customer>
{
public CustomerMap()
{
Id(x => x.Id)
.Column("CustomerId");
Map(x => x.Name);
}
}
public class OrderMap : ClassMap<Order>
{
public OrderMap()
{
Schema("schema2");
Id(x => x.Id)
.Column("OrderID");
Map(x => x.CustomerName)
.Column("CustomerName");
References<Customer>(x => x.Customer, "CustomerName");
}
}
SQL Chciałbym napisać, aby otrzymać wyniki chcę byłoby coś jak:
select o.OrderId, o.CustomerName, c.CustomerId
from order o
inner join customer c on c.Name = o.CustomerName
Czy to w ogóle możliwe? Czy istnieje inny/lepszy sposób na zrobienie tego?
Dzięki! Tak było. Próbowałem pojedynczo "Kolumny" i "PropertyRef", ale nie sądziłem, że spróbuję ich razem z jakiegoś powodu. – Hamman359
Świetnie, właśnie tego szukałem. Możesz również skorzystać z silnego pisania za pomocą parametru PropertyRef, używając zamiast niego lambdas, tj. PropertyRef (x => x.Name). Oznacza to, że nie złamie się, jeśli zmienisz swoją klasę klienta. – nukefusion
To pomogło nawet z Jednym do wielu! :) – Turowicz