2012-03-13 24 views
5

Tôi đang làm việc với cơ sở dữ liệu brownfield sử dụng các chuỗi làm khóa chính. Sử dụng Fluent NHibernate với Sqlite (nhà cung cấp trong bộ nhớ để kiểm tra đơn vị) và SQL Server 2005.Cách sử dụng các phím chuỗi trong (thông thạo) NHibernate

Tôi có thực thể sau:

public class Entity 
{ 
    public virtual DateTime TimeStamp { get; set; } 

    public virtual string Name { get; set; } 
} 

Với bản đồ này:

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Map(_ => _.TimeStamp); 
     Id(_ => _.Name).CustomType("AnsiString"); 
    } 
} 

Tuy nhiên nó không hoạt động nói NHibernate.TypeMismatchException : Provided id of the wrong type. Expected: System.Int32, got System.String

Làm thế nào làm cho công việc này? Ngoài ra, có bất kỳ tài liệu tốt về nhibernate thông thạo có sẵn không?

Xin cảm ơn trước.

+0

Thx cho các liên kết, mặc dù họ không phải là mới đối với tôi cũng không được chứa bất cứ điều gì liên quan đến câu hỏi của tôi :) Tôi đã không thể tìm thấy bất cứ điều gì về phím chuỗi đó. Ngoài ra tôi muốn bắt đầu với ánh xạ rõ ràng. –

+0

Điều này được thảo luận trong liên kết này http://stackoverflow.com/questions/411825/nhibernate-with-string-primary-key-and-relationships –

+0

@krystanhonour không chính xác. Ngoài ra câu hỏi đó không có câu trả lời được chấp nhận. Nếu bạn có thể nhận ra câu trả lời, bạn có thể đăng lại ở đây và nhận được phiếu bầu và sự đánh giá của tôi không? Cám ơn. –

Trả lời

12

Nếu bạn đang sử dụng chuỗi như là chìa khóa chính của bạn có thể bạn sẽ phải làm một cái gì đó như thế này:

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Id(x => x.Name).GeneratedBy.Assigned(); 
     Map(x => x.TimeStamp); 
    } 
} 

Từ các tài liệu nhibernate:

5.1.4.7. Số nhận dạng được gán

Nếu bạn muốn ứng dụng chỉ định số nhận dạng (trái ngược với khi tạo NHibernate), bạn có thể sử dụng trình tạo được gán. Máy phát điện đặc biệt này sẽ sử dụng giá trị định danh đã được gán cho thuộc tính định danh của đối tượng. Hãy rất cẩn thận khi sử dụng tính năng này để gán các phím có ý nghĩa kinh doanh (hầu như luôn là quyết định thiết kế khủng khiếp).

Do tính chất vốn có của nó, các thực thể sử dụng trình tạo này không được được lưu thông qua phương thức SaveOrUpdate() của ISession. Thay vào đó, bạn phải chỉ định rõ ràng cho NHibernate nếu đối tượng cần được lưu hoặc được cập nhật bằng cách gọi phương thức Save() hoặc Update() của ISession.

Đây cũng là bài viết liên quan. Đó là một chút ngày nhưng vẫn áp dụng cho tình hình của bạn:

http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/6c9620b7c5bb7ca8

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