2010-09-03 37 views
7

Tôi có một bảng con chứa id cho phụ huynh. Đây là một ánh xạ một, nhưng bảng con có thể thiếu các giá trị. Tôi đang gặp vấn đề lập bản đồ này mà không nhận được một lỗi mặc dù ... Tôi đã thử một vài điều; lập bản đồ cùng một cột, có tính riêng biệt vv ..Sử dụng tham chiếu làm id trong fluentnhibernate

 
Parent table 
    int id 

Child table 
    int parentid 

Parent class 
    int id 

Child class 
    Parent parent // note I'm referencing parent, not using an int id.. 

Mapping

Id(x => x.Parent) 
    .Column("parentid"); // fails 

Id(x => x.Parent.Id) 
    .Column("parentid"); // fails 

References(x => x.Parent) 
    .Column("parentid"); // fails - missing id 

// Adding an id field in addition to parent for 
// child class (id is then the same as parent.id) 
// fails on save 
Id(x => x.Id) 
    .Column("parentid"); 
References(x => x.Parent) 
    .Column("parentid"); 

Tôi muốn lớp trẻ không có một trường Id biệt, nhưng thay vì chỉ là một tham chiếu đến cha mẹ như có thể không bao giờ là một đứa trẻ không có cha mẹ. Trong cơ sở dữ liệu tuy nhiên, tôi muốn chỉ lưu trữ id của cha mẹ.

Bất kỳ ý tưởng nào về cách tôi có thể thực hiện việc này?

Trả lời

5

Các công trình sau đây:

Id(x => x.Parent.Id).Column("MemberID"); 
References(x => x.Parent).Column("MemberID").ReadOnly(); 

Các ReadOnly cho tài liệu tham khảo rất quan trọng để không nhận được một ngoại lệ

EDIT: Chẳng phải đơn giản như vậy ...

lớp Con tôi vẫn còn thuộc tính Id được gọi. Dường như tham chiếu Id cho Parent.Id confuses nhibernate, và nó cố gắng gọi child.Id để thay thế. Tôi đã thêm phần sau đây vào con, và bây giờ có vẻ như nó hoạt động .. Mặc dù một hack khá xấu xí.

public virtual int Id { 
    get { return Parent.Id; } 
    set { Debug.Assert(value == Parent.Id); } 
} 
+0

1 Làm việc cho tôi ở đây, nhưng có một cách thanh lịch hơn để làm như vậy? –

0

API FluentNHibernate đã thay đổi trong những năm qua vì vậy tôi không chắc chắn nếu cú ​​pháp này là có sẵn khi câu hỏi này được hỏi ban đầu nhưng bây giờ bạn có thể sử dụng một tài liệu tham khảo như một id nếu bạn ánh xạ nó như là một id composite. Tôi sẽ không gọi đây là một hack nhưng nó là một chút lạ mà bạn phải ánh xạ tham chiếu đến thực thể cha mẹ như một phần của một id tổng hợp. Dưới đây là ví dụ đầy đủ:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
     Table("StackOverflowExamples.dbo.Parent"); 

     Id(x => x.ParentId); 
     Map(x => x.FirstName); 
     Map(x => x.LastName); 
    } 
} 

public class OnlyChildOfParentMap : ClassMap<OnlyChildOfParent> 
{ 
    public OnlyChildOfParentMap() 
    { 
     Table("StackOverflowExamples.dbo.OnlyChildOfParent"); 

     CompositeId().KeyReference(x => x.Parent, "ParentId"); 
     Map(x => x.SomeStuff); 
     Map(x => x.SomeOtherStuff); 
    } 
} 

public class Parent 
{ 
    public virtual int ParentId { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
} 

public class OnlyChildOfParent 
{ 
    public virtual Parent Parent { get; set; } 
    public virtual string SomeStuff { get; set; } 
    public virtual string SomeOtherStuff { get; set; } 

    #region Overrides 

    public override bool Equals(object obj) 
    { 
     if (obj == null || GetType() != obj.GetType()) 
      return false; 

     var child = obj as OnlyChildOfParent; 

     if (child != null && child.Parent != null) 
     { 
      return child.Parent.ParentId == Parent.ParentId; 
     } 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return Parent.ParentId; 
    } 

    #endregion Overrides 
} 
0

Có thể this bài đăng có thể hữu ích.
Tôi đã sử dụng chú thích .Cascade.SaveUpdate().
trường hợp của tôi là với một hasone trong các phụ huynh đưa các chú thích trên cả hai mặt

Obs: Ngôn ngữ PT-BR

+0

Sẽ rất hữu ích nếu bạn có thể dịch phần liên quan của câu trả lời được liên kết ... –

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