2012-03-13 25 views
8

Tôi hiện đang làm việc trên một dự án MVC 3 sử dụng Fluent NHibernate. Tôi sử dụng enum System.DayOfWeek nhưng khi lập bản đồ này, tôi nhận được lỗi sau -Ánh xạ DayOfWeek từ không gian tên System bằng cách sử dụng Fluent Nhibernate

Stack Trace: 

[MappingException: Could not determine type for: DayOfWeek, for columns:  NHibernate.Mapping.Column(WeekStart)] 
NHibernate.Mapping.SimpleValue.get_Type() +456 
NHibernate.Mapping.SimpleValue.IsValid(IMapping mapping) +40 
NHibernate.Mapping.PersistentClass.Validate(IMapping mapping) +123 
NHibernate.Mapping.RootClass.Validate(IMapping mapping) +24 
NHibernate.Cfg.Configuration.ValidateEntities() +280 
NHibernate.Cfg.Configuration.BuildSessionFactory() +43 
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() +54 

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

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET  
Version:4.0.30319.272 

Ví dụ sử dụng -

Map(x => x.WeekStart).CustomType(typeof(DayOfWeek)); 

Tôi đã nhìn thấy câu hỏi cụ thể này hỏi về danh sách gửi thư và trên stackoverflow nhưng sắc thái của nó dường như không bao giờ được nắm bắt hoàn toàn và người hỏi câu hỏi được gọi là cách sử dụng ánh xạ kiểu tùy chỉnh.

Tôi biết rõ cách sử dụng chức năng tùy chỉnh trên bản đồ thông thạo và thường xuyên sử dụng nó. Tuy nhiên tôi không hiểu tại sao enum này đặc biệt không thể được ánh xạ. Tôi đoán nó có cái gì để làm với không gian tên hệ thống mà nó thuộc về?

Nếu ai cũng có thể làm sáng tỏ điều này, tôi sẽ rất vui.

Cảm ơn

+0

Bạn đã bao giờ tìm thấy câu trả lời cho điều này? Bạn có thể chỉ định một loại tùy chỉnh của int cho enums, mặc dù việc đúc làm cho thuộc tính bị dơ có thể gây ra các cập nhật không cần thiết. –

Trả lời

1

Tôi đã lập bản đồ DayOfWeek enum để làm việc với ánh xạ này.

mapping.Map(x => x.DayOfWeek); 

và bản đồ của nó được tinh chỉnh vào nvarchar (255) trong cơ sở dữ liệu mssql của tôi.

looklikes tài sản của tôi này

public virtual DayOfWeek DayOfWeek { get; set; } 

tôi sử dụng NHibernate phiên bản: 3.3.1.4000 và Fluent Nhibernate phiên bản: 1.3.0.733

1

Như với bất kỳ bản đồ enum với NHibernate, tiết kiệm cho mình một số đau buồn (bẩn lần đọc gây ra các ghi không cần thiết, loại khác nhau được chỉ định trong cơ sở dữ liệu, vv) và luôn sử dụng PersistentEnumType.

Trong ví dụ này, tạo PersistentEnumType của bạn:

public class NHibernateDayOfWeekEnumMapper : global::NHibernate.Type.PersistentEnumType 
{ 
    public NHibernateDayOfWeekEnumMapper() 
     : base(typeof(DayOfWeek)) 
    { 

    } 
} 

Sau đó sử dụng nó để làm bản đồ của bạn:

Map(x => x.DayOfWeek).CustomType<NHibernateDayOfWeekEnumMapper>().Not.Nullable(); 

Bây giờ bạn đã có những thực thể mà không đọc bẩn (và do đó không cần viết) và ánh xạ kiểu đúng trong cơ sở dữ liệu (khi bạn sử dụng SchemaExport để tạo lược đồ của bạn).

Để biết thêm thông tin, xem một oldie nhưng goody tại http://eashi.wordpress.com/2008/08/19/mapping-enumeration-of-type-int-in-nhibernate/

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