2011-08-01 21 views
2

我試圖從this文章複製此表結構。如何使鑑別表更有用

http://grabbagoftimg.s3.amazonaws.com/nhib_disc_01.PNG

這裏是我的POCO的和映射。

POCO的

public class Item 
{ 
    public virtual int Id { get; set; } 
    public virtual Status ItemStatus { get; set; } 
} 

public abstract class Status 
{ 
    private readonly int _id; 
    public static readonly Status Foo = new FooStatus(1); 
    public static readonly Status Bar = new BarStatus(2); 

    public Status() 
    { 

    } 

    protected Status(int id) 
    { 
     _id = id; 
    } 

    public virtual int Id { get { return _id; } } 
    public abstract string Name { get; } 
    public abstract string BackgroundColor { get; } 
} 

public class FooStatus : Status 
{ 
    public FooStatus() 
    { 

    } 

    public FooStatus(int id) 
     : base(id) 
    { 

    } 

    public override string Name 
    { 
     get { return "Foo Status"; } 
    } 

    public override string BackgroundColor 
    { 
     get { return "White"; } 
    } 
} 

public class BarStatus : Status 
{ 
    public BarStatus() 
    { 

    } 

    public BarStatus(int id) 
     : base(id) 
    { 

    } 

    public override string Name 
    { 
     get { return "Bar Status"; } 
    } 

    public override string BackgroundColor 
    { 
     get { return "Black"; } 
    } 
} 

映射:

public class ItemMap : ClassMap<Item> 
{ 
    public ItemMap() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     References(x => x.ItemStatus); 
    } 
} 

public class StatusMap : ClassMap<Status> 
{ 
    public StatusMap() 
    { 
     Id(x => x.Id).GeneratedBy.Assigned(); 

     DiscriminateSubClassesOnColumn<int>("ItemStatus", 0); 
    } 
} 

public class FooStatusSubMap : SubclassMap<FooStatus> 
{ 
    public FooStatusSubMap() 
    { 
     Extends<Status>(); 
     DiscriminatorValue(1); 
    } 
} 

public class BarStatusSubMap : SubclassMap<BarStatus> 
{ 
    public BarStatusSubMap() 
    { 
     Extends<Status>(); 
     DiscriminatorValue(2); 
    } 
} 

這樣做的問題是,它會產生這樣的我Status表:

標識.... ItemStatus

1 ..... 1

2 ..... 2

正如你所看到的,這是無用的,因爲兩列總是包含相同的值。

如何複製上面鏈接的圖像?

回答

3

這裏的關鍵是,那個ID和Discriminatorcolumn必須有相同的列名

public class StatusMap : ClassMap<Status> 
{ 
    public StatusMap() 
    { 
     Id(x => x.Id, "ItemStatus").GeneratedBy.Assigned(); 

     DiscriminateSubClassesOnColumn<int>("ItemStatus", 0); 
    } 
} 
+0

真棒!感謝你的回答。 – User