2017-06-08 58 views
6

Tôi có lớp nàyLàm thế nào để sử dụng thủ tục cơ sở dữ liệu thông thạo bản đồ nhibernate

public class Bill : EntityBase 
{ 
     public virtual decimal Value { get; set; } 
} 

và ở bên dưới bản đồ, tôi điền vào các giá trị của 'Giá trị' sử dụng một thủ tục trong một Formula()

public class MapBill : ClassMap<Bill> 
{ 
    public MapBill() 
    { 
     Table("cabrec"); 
     Map(m => m.Value) 
      .Formula(
"(select t.VALOR_IND from ret_vlorind(1,1,cast('02/06/1993' as Date)) as t)") 
      .CustomType(typeof(decimal)); 
    } 
} 

Nhưng nó trả về lỗi khi thực hiện:

{"Dynamic SQL Error\r\nSQL error code = -104\r\nToken unknown - line 1, column 279\r\n."} 

Có cách nào để sử dụng quy trình trong bộ thông thạo trang trí công phu?

+0

Loại bạn đang sử dụng. Có lẽ điều này có thể giải quyết vấn đề của bạn http://www.iprogrammable.com/2009/09/05/get-oracle-stored-procedure-output-object-output-in-nhibernate/ – tykovec

+0

Cảm ơn câu trả lời, tôi đã thử điều này nhưng không có kết quả. Vấn đề nằm trong 'bí danh' của quy trình. sử dụng Firebird. –

Trả lời

5

Khái niệm bản đồ công thức sau được chuyển đổi bởi NHibernate để tuyên bố như

// source in code 
(select t.VALOR_IND from ret_vlorind(1,1,cast('02/06/1993' as Date)) as t) 
// sent SQL statement 
(select t.VALOR_IND from ret_vlorind(1,1,cast('02/06/1993' as Date)) as this_.t) 

Các this_ này. Tiền tố được tiêm tại các vị trí, trong đó NHibernate cho rằng nó nên sử dụng đúng bí danh bảng CHÍNH.

Đây không phải là điều chúng tôi muốn .. và cách duy nhất tôi tìm thấy là giới thiệu phương ngữ riêng của chúng tôi (Tôi đang làm việc với SQL Server) và xác định một số "CONSTANTS" để được coi là - Tôi không cần tiền tố

public class CustomMsSql2012Dialect : MsSql2012Dialect 
{ 
    public CustomMsSql2012Dialect() 
    { 
     RegisterKeyword("my_table_alias"); 
     ... 

này phải được sử dụng cho cấu hình

<property name="dialect">MyNamespace.CustomMsSql2012Dialect,MyLib</property> 

Và cuối cùng, chúng ta phải điều chỉnh tuyên bố của chúng tôi

// wrong t is not known keyword.. would be prefixed 
(select t.VALOR_IND from ret_vlorind(1,1,cast('02/06/1993' as Date)) as t) 
// into this 
(select my_table_alias.VALOR_IND from ret_vlorind(1,1,cast('02/06/1993' as Date)) as my_table_alias) 

LƯU Ý: từ khóa, trải nghiệm của tôi, phải chỉ là trường hợp thấp hơn

+0

Cảm ơn câu trả lời. Tôi đang sử dụng Fluent Nhibernate. Tôi phải hiểu vấn đề, nhưng tôi mới biết 'Thông thạo' và tôi không biết tôi có thể tạo bí danh này ở đâu, bạn có biết liệu bạn có thể tạo bí danh này bằng cách sử dụng 'Thông thạo' không? –

+1

Vâng, thay đổi duy nhất (thông thạo) sẽ là cách thức thiết lập phương ngữ. Kiểm tra http://nhibernate.info/blog/2008/09/06/a-fluent-interface-to-nhibernate-part-4-configuration.html này. 'Một ví dụ var cfg = new MyConfiguration() .ShowSql() .Driver () .Dialect () ' –

+1

nên không phải là' t.VALOR_IND' được thay đổi cho' my_table_alias.VALOR_IND '? Trong trường hợp của OP, phương ngữ cơ sở của nó sẽ là 'FirebirdDialect'. Có từ khóa phải được đăng ký trong trường hợp thấp hơn. Một chút không may là nó không được điều chỉnh bởi 'RegisterKeyword', nhưng hiện tại nó cũng vậy. Tuy nhiên, chúng sẽ khớp với bất kỳ trường hợp nào trong các truy vấn, miễn là chúng được đăng ký trong trường hợp thấp hơn. (Mã thông báo ứng viên được "hạ thấp" trước khi khớp.) –

Các vấn đề liên quan