2011-11-01 6 views
2

私はこのようになりPOCOオブジェクトのカップルがあります:私はそうのような界面特性をマッピングしています流暢なNHibernateが余分な外部キー列を作成しています...なぜですか?

public class DataObjectMapping : ClassMap<DataObject> 
{ 
    public DataObjectMapping() 
    { 
     Table("DataObjects"); 

     this.MapIDataObjectProperties(); 
     this.MapIHasProperties(); 
    } 
} 

    public ObjectPropertyMapping() 
    { 
     Table("ObjectProperties"); 
     Id(x => x.ObjectPropertyID).Column("ObjectPropertyID"); 
     References(x => x.Object).Index("ixObject.Name").Column("ObjectID").Not.Nullable(); 
     Map(x => x.Name).Index("ixObject.Name").Length(100).Not.Nullable(); 
     Map(x => x.Scale); 
     Map(x => x.Precision); 
     Map(x => x.Type); 
     Map(x => x.Value); 
    } 
} 

public abstract class DataObject : IDataObject 
{ 
    public virtual Guid ObjectID { get; set; } 
    public virtual IList<ObjectProperty> Properties { get; set; } 
} 

public class ObjectProperty : IProperty 
{ 
    public virtual Guid ObjectPropertyID { get; set; } 
    public virtual DataObject Object { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Value { get; set; } 
    public virtual string Type { get; set; } 
    public virtual int? Scale { get; set; } 
    public virtual int? Precision { get; set; } 
} 

を私はそうのようなマッピングが

public static void MapIHasProperties<T>(this ClassMap<T> target) where T : IHasProperties 
    { 
     target.HasMany(x => x.Properties); 
    } 

を使用してデータベース(MSSQL 2005)を生成するとき
public static ISessionFactory SessionFactory 
    { 
     get 
     { 
      if (_SessionFactory == null) 
      { 
       var config = new Configuration().Configure(); 
       _SessionFactory = Fluently.Configure(config) 
        .Mappings(m=>m.FluentMappings.AddFromAssemblyOf<Site>() 
         .Conventions.Add<CustomForeignKeyConvention>()) 
        .ExposeConfiguration(c => { new SchemaExport(c).Create(false, true); }) 
        .BuildSessionFactory(); 
      } 
      return _SessionFactory; 
     } 
    } 

は、私は物事を正しくリンクで終わるが、私のobjectPropertiesのテーブル内の余分な列で、と私は理解していない理由:

USE [Sandbox] 
GO 
/****** Object: Table [dbo].[ObjectProperties] Script Date: 11/01/2011 13:50:18 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[ObjectProperties](
    [ObjectPropertyID] [uniqueidentifier] NOT NULL, 
    [Name] [nvarchar](100) NOT NULL, 
    [Scale] [int] NULL, 
    [Precision] [int] NULL, 
    [Type] [nvarchar](255) NULL, 
    [Value] [nvarchar](255) NULL, 
    [ObjectID] [uniqueidentifier] NOT NULL, 
    [DataObject_id] [uniqueidentifier] NULL, 
PRIMARY KEY CLUSTERED 
(
    [ObjectPropertyID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
ALTER TABLE [dbo].[ObjectProperties] WITH CHECK ADD CONSTRAINT [FKFBE776BE7C346D9] FOREIGN KEY([DataObject_id]) 
REFERENCES [dbo].[DataObjects] ([ObjectID]) 
GO 
ALTER TABLE [dbo].[ObjectProperties] CHECK CONSTRAINT [FKFBE776BE7C346D9] 
GO 
ALTER TABLE [dbo].[ObjectProperties] WITH CHECK ADD CONSTRAINT [FKFBE776BF671B18E] FOREIGN KEY([ObjectID]) 
REFERENCES [dbo].[DataObjects] ([ObjectID]) 
GO 
ALTER TABLE [dbo].[ObjectProperties] CHECK CONSTRAINT [FKFBE776BF671B18E] 

私は外部キーを持つ2つの列を持っている理由誰かが私に説明することができますDataObjectsテーブルの同じ列にマップされていて、どうしたらそれが起こるのを防ぐことができますか?

答えて

2

私はここに答えが見つかりました:

public DataObjectMapping() 
{ 
    Table("DataObjects"); 
    Id(x => x.ObjectID).Column("ObjectID"); 
    HasMany(x => x.Properties).KeyColumn("ObjectID"); 
} 

、すべて良好であった:基本的に私はそうは次のように私のプロパティのコレクション内のキー列を指定するために必要なFluent NHibernate generates extra columnsを。