8

Tôi đang thiết lập một giải pháp mới để ánh xạ với dữ liệu SQL đã được nhập từ cơ sở dữ liệu Access. Ánh xạ tự động hoạt động tốt với các thực thể mà tôi đã xác định nhưng tôi cần có khả năng sử dụng loại ánh xạ Fluent để cấp quyền truy cập vào phần mở rộng .NotFound.Ignore.Thông thạo nHibernate: Loại bản đồ không được hỗ trợ

Tôi đã sử dụng chính xác cú pháp tương tự trong một dự án khác (tôi nghĩ!) Hoạt động tốt. Tôi đã tạo lỗi trường học để gây ra "Loại bản đồ không được hỗ trợ" IT.Classes.Entities.Admin '"phải không? Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.

DDL:

CREATE TABLE [dbo].[Admin](
    [ID] [int] NOT NULL, 
    [primaryEmail] [nvarchar](50) NULL, 
    [secondaryEmail] [nvarchar](50) NULL, 
    [highPriorityEmail] [nvarchar](50) NULL, 
    [MobileEmail] [nvarchar](50) NULL, 
    [EmailUser] [bit] NOT NULL, 
    [HelpDeskMessage] [nvarchar](max) NULL 
) ON [PRIMARY] 

Entity:

namespace IT.Classes.Entities 
{ 
    public class Admin 
    { 
    public virtual bool EmailUser { get; set; } 

    public virtual string HelpdeskMessage { get; set; } 

    public virtual string HighPriorityEmail { get; set; } 

    public virtual int Id { get; set; } 

    public virtual string MobileEmail { get; set; } 

    public virtual string PrimaryEmail { get; set; } 

    public virtual string SecondaryEmail { get; set; } 
    } 
} 

Mapping:

sử dụng FluentNHibernate.Mapping; sử dụng IT.Classes.Entities;

namespace IT.Classes.Mappings 
{ 
    public sealed class AdminMap : ClassMap<Admin> 
    { 
     public AdminMap() 
     { 
      this.Id(x => x.Id); 
      this.Map(x => x.EmailUser); 
      this.Map(x => x.HelpdeskMessage); 
      this.Map(x => x.HighPriorityEmail); 
      this.Map(x => x.MobileEmail); 
      this.Map(x => x.PrimaryEmail); 
      this.Map(x => x.SecondaryEmail); 
     } 
    } 
} 

phiên Factory:

private static ISessionFactory CreateItHelpdeskSessionFactory() 
{ 
    return 
     Fluently.Configure().Database(
      MsSqlConfiguration.MsSql2008.ConnectionString(
       ConfigurationManager.ConnectionStrings["ITHelpdesk"].ConnectionString)) 
       .Mappings(m => m.FluentMappings.Add<Admin>()) 
       .Mappings(m => m.FluentMappings.Add<Applications>()) 
       .Mappings(m => m.FluentMappings.Add<Category>()) 
       .Mappings(m => m.FluentMappings.Add<Log>()) 
       .Mappings(m => m.FluentMappings.Add<Multipliers>()) 
       .Mappings(m => m.FluentMappings.Add<Os>()) 
       .Mappings(m => m.FluentMappings.Add<Priority>()) 
       .Mappings(m => m.FluentMappings.Add<Request>()) 
       .Mappings(m => m.FluentMappings.Add<Status>()) 
       .BuildSessionFactory(); 
} 

EDIT

tôi nghĩ rằng tôi sẽ xuất khẩu ánh xạ tự động để xem họ sẽ làm nổi bật một vấn đề trong các ánh xạ thông thạo của tôi, nhưng họ có vẻ là đúng :

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="IT.Classes.Entities.Admin, ITClasses, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Admin`"> 
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="identity" /> 
    </id> 
    <property name="EmailUser" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="EmailUser" /> 
    </property> 
    <property name="HelpdeskMessage" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="HelpdeskMessage" /> 
    </property> 
    <property name="HighPriorityEmail" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="HighPriorityEmail" /> 
    </property> 
    <property name="MobileEmail" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="MobileEmail" /> 
    </property> 
    <property name="PrimaryEmail" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="PrimaryEmail" /> 
    </property> 
    <property name="SecondaryEmail" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="SecondaryEmail" /> 
    </property> 
    </class> 
</hibernate-mapping> 

EDIT 2

Theo dõi ngăn xếp đầy đủ. Lưu ý potentialreasons = 0.

FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail. 
---> FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail. 

---> System.InvalidOperationException: Unsupported mapping type 'IT.Classes.Entities.Admin' 
    at FluentNHibernate.PersistenceModel.Add(Type type) in d:\Builds\FluentNH\src\FluentNHibernate\PersistenceModel.cs:line 152 
    at FluentNHibernate.Cfg.FluentMappingsContainer.Apply(PersistenceModel model) in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentMappingsContainer.cs:line 127 
    at FluentNHibernate.Cfg.MappingConfiguration.Apply(Configuration cfg) in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\MappingConfiguration.cs:line 84 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration() in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 252 
    --- End of inner exception stack trace --- 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildConfiguration() in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 264 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 230 
    --- End of inner exception stack trace --- 
    at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in d:\Builds\FluentNH\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 235 
    at ConsoleChecker.Program.CreateItHelpdeskSessionFactory() in E:\code\code_testing\2010\ASPHelpdesks\ConsoleChecker\Program.cs:line 48 
    at ConsoleChecker.Program.GetRequests() in E:\code\code_testing\2010\ASPHelpdesks\ConsoleChecker\Program.cs:line 40 
    at ConsoleChecker.Program.Main(String[] args) in E:\code\code_testing\2010\ASPHelpdesks\ConsoleChecker\Program.cs:line 24 
+0

Tôi đã nghĩ rằng thiếu của khóa chính trên bảng có thể gây ra vấn đề vì vậy tôi đặt cột Id là PK nhưng vẫn là lỗi tương tự. – Rowan

+0

Suy nghĩ thêm - tạo ra một cơ sở dữ liệu trống và sử dụng công cụ tạo lược đồ để cố gắng tự động tạo các bảng và loại trừ bất kỳ vấn đề nào với chính cơ sở dữ liệu đó. Điều này vẫn không thành công với cùng một lỗi. – Rowan

+0

Khi nào thì ngoại lệ xảy ra? Vui lòng đăng ngoại lệ đầy đủ! Exception.ToString() –

Trả lời

9

Trong mã cấu hình của bạn, các loại được đề cập trong Mappings thạo nên là lớp bản đồ, không phải là lớp được ánh xạ.

Đó là, thay vì:

return 
    Fluently.Configure().Database(
     MsSqlConfiguration.MsSql2008.ConnectionString(
      ConfigurationManager.ConnectionStrings["ITHelpdesk"].ConnectionString)) 
      .Mappings(m => m.FluentMappings.Add<Admin>()) 
      .Mappings(m => m.FluentMappings.Add<Applications>()) 
      .Mappings(m => m.FluentMappings.Add<Category>()) 
      .Mappings(m => m.FluentMappings.Add<Log>()) 
      .Mappings(m => m.FluentMappings.Add<Multipliers>()) 
      .Mappings(m => m.FluentMappings.Add<Os>()) 
      .Mappings(m => m.FluentMappings.Add<Priority>()) 
      .Mappings(m => m.FluentMappings.Add<Request>()) 
      .Mappings(m => m.FluentMappings.Add<Status>()) 
      .BuildSessionFactory(); 

Bạn cần phải nói:

return 
    Fluently.Configure().Database(
     MsSqlConfiguration.MsSql2008.ConnectionString(
      ConfigurationManager.ConnectionStrings["ITHelpdesk"].ConnectionString)) 
      .Mappings(m => m.FluentMappings.Add<AdminMap>()) 
      .Mappings(m => m.FluentMappings.Add<ApplicationsMap>()) 
      .Mappings(m => m.FluentMappings.Add<CategoryMap>()) 
      .Mappings(m => m.FluentMappings.Add<LogMap>()) 
      .Mappings(m => m.FluentMappings.Add<MultipliersMap>()) 
      .Mappings(m => m.FluentMappings.Add<OsMap>()) 
      .Mappings(m => m.FluentMappings.Add<PriorityMap>()) 
      .Mappings(m => m.FluentMappings.Add<RequestMap>()) 
      .Mappings(m => m.FluentMappings.Add<StatusMap>()) 
      .BuildSessionFactory(); 

Thậm chí tốt hơn, để tránh việc một dòng riêng biệt cho mỗi lớp ánh xạ, sử dụng .AddFromAssemblyOf <> (), sử dụng phản chiếu để thêm tất cả bản đồ lớp từ một hội đồng đã cho:

return 
    Fluently.Configure().Database(
     MsSqlConfiguration.MsSql2008.ConnectionString(
      ConfigurationManager.ConnectionStrings["ITHelpdesk"].ConnectionString)) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<AdminMap>()) 
      .BuildSessionFactory(); 
+0

Cảm ơn bạn, vì vậy nó là một lỗi học sinh! – Rowan

+1

cách tiếp cận tốt hơn sẽ được kế thừa tất cả Maps cho một số giao diện nói IMap và sử dụng .Mappings (m => m.FluentMappings.AddFromAssemblyOf ()) –