{"id":51,"date":"2012-03-13T21:36:00","date_gmt":"2012-03-13T21:36:00","guid":{"rendered":"http:\/\/tpodolak.com.hostingasp.pl\/blog\/2012\/03\/13\/fluentnhibernate-mapowanie-kolumn-typu-time\/"},"modified":"2016-01-31T00:19:04","modified_gmt":"2016-01-31T00:19:04","slug":"fluentnhibernate-mapowanie-kolumn-typu-time","status":"publish","type":"post","link":"https:\/\/tpodolak.com\/blog\/2012\/03\/13\/fluentnhibernate-mapowanie-kolumn-typu-time\/","title":{"rendered":"FluentNhibernate &#8211; mapowanie kolumn typu time"},"content":{"rendered":"<p>Witam<br \/>\nOstatnio napotka\u0142em na do\u015b\u0107 ciekawy wyj\u0105tek podczas wykonywania NHibernatowego inserta. W bazie danych mam prost\u0105 tabel\u0119<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Table.jpg\" rel=\"attachment wp-att-434\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Table.jpg\" alt=\"Table\" width=\"285\" class=\"aligncenter size-full wp-image-434\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Table.jpg 285w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Table-150x92.jpg 150w\" sizes=\"(max-width: 285px) 100vw, 285px\" \/><\/a><br \/>\nDo takiej tabeli zosta\u0142 stworzony model<\/p>\n<pre lang=\"csharp\">\r\nnamespace Model\r\n{\r\n    public class Appointment\r\n    {\r\n        public virtual int Id { get; set; }\r\n        public virtual string Name { get; set; }\r\n        public virtual DateTime StartDate { get; set; }\r\n        public virtual TimeSpan Duration { get; set; }\r\n    }\r\n}<\/pre>\n<p>oraz mapping<\/p>\n<pre lang=\"csharp\">\r\nnamespace Model.Mappings\r\n{\r\n    public class AppointmentMapping : ClassMap<Appointment>\r\n    {\r\n        public AppointmentMapping()\r\n        {\r\n            Id(val => val.Id).GeneratedBy.Native();\r\n            Map(val => val.Name).Not.Nullable();\r\n            Map(val => val.StartDate).Not.Nullable();\r\n            Map(val => val.Duration).Not.Nullable();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Niestety ku mojemu zaskoczeniu pr\u00f3buj\u0105c zapisa\u0107 do bazy obiekt typu Appointment dosta\u0142em nast\u0119puj\u0105cy wyj\u0105tek<br \/>\n<i>SqlException: Operand type clash: bigint is incompatible with time<\/i><br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Exception.jpg\" rel=\"attachment wp-att-432\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Exception-1024x358.jpg\" alt=\"Exception\" width=\"700\" class=\"aligncenter size-large wp-image-432\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Exception-1024x358.jpg 1024w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Exception-150x52.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Exception-300x105.jpg 300w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Exception.jpg 1110w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><br \/>\nM\u00f3wi\u0105c szczerze wyj\u0105tek ten niewiele mi powiedzia\u0142, zw\u0142aszcza, \u017ce zapytanie wygenerowane przez NHibernata (przechwycone w NHibernateProfilerze) wygl\u0105da\u0142o jak najbardziej poprawnie. Jednak\u017ce zapytanie przechwycone przez SqlProfilera wygl\u0105da\u0142o w nast\u0119puj\u0105cy spos\u00f3b<\/p>\n<pre lang=\"sql\">\r\nexec sp_executesql N'INSERT INTO [Appointment] (Name,StartDate,Duration) VALUES (@p0,@p1,@p2); \r\nselect SCOPE_IDENTITY()',\r\nN'@p0 nvarchar(4000),\r\n@p1 datetime,\r\n@p2 bigint',\r\n@p0=N'appoitnemt',\r\n@p1='2012-03-13 00:00:00',\r\n@p2=439320000000\r\n<\/pre>\n<p>Wida\u0107 tutaj, \u017ce drugi parametr (@p2) zosta\u0142 oznaczony jako bigint, a nie time (tak jak jest to oznaczone w bazie). Przyczyn\u0105 takiego stanu rzeczy jest z\u0142y mapping. Z tego co wyczyta\u0142em, je\u017celi chcemy aby poprawnie zmapowa\u0107 TimeSpana na kolumn\u0119 typu time, musimy zmodyfikowa\u0107 interesuj\u0105cy nas mapping na nast\u0119puj\u0105cy.<\/p>\n<pre lang=\"csharp\">\r\nMap(val => val.Duration).Not.Nullable().CustomType(\"TimeAsTimeSpan\");\r\n<\/pre>\n<p>Maj\u0105c taki mapping nasze zapytanie zostanie wygenerowane poprawnie i operacja insertu zako\u0144czy si\u0119 powodzeniem<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Result.jpg\" rel=\"attachment wp-att-433\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Result.jpg\" alt=\"FluentNhibernate\" width=\"500\" class=\"aligncenter size-full wp-image-433\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Result.jpg 521w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Result-150x27.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/03\/fluentnhibernate-mapowanie-kolumn-typu-time\/Result-300x54.jpg 300w\" sizes=\"(max-width: 521px) 100vw, 521px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Witam Ostatnio napotka\u0142em na do\u015b\u0107 ciekawy wyj\u0105tek podczas wykonywania NHibernatowego inserta. W bazie danych mam prost\u0105 tabel\u0119 Do takiej tabeli zosta\u0142 stworzony model namespace Model { public class Appointment { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual DateTime StartDate { get; set; } public [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[66,36,46],"tags":[209,184,193],"class_list":["post-51","post","type-post","status-publish","format-standard","hentry","category-fluentnhibernate","category-mssql","category-nhibernate","tag-fluentnhibernate","tag-mssql","tag-nhibernate"],"_links":{"self":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/51","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/comments?post=51"}],"version-history":[{"count":4,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/51\/revisions"}],"predecessor-version":[{"id":557,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/51\/revisions\/557"}],"wp:attachment":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/media?parent=51"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/categories?post=51"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/tags?post=51"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}