0

我有一個叫工人fluent-nhibernate automapping外鍵插入null。

public class Worker : BaseEntity 
{ 
    public virtual int WorkerID { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Indemnification> Indemnifications { get; set; } 
} 

public class Indemnification : BaseEntity 
{ 
    public virtual int IndemnificationID { get; set; } 
    public virtual string IndemnificationNumber { get; set; } 
    //another properties 
} 

我使用了一些約定

var mappings = new AutoPersistenceModel(); 
       mappings.AddEntityAssembly(typeof(Worker).Assembly).Where(GetAutoMappingFilter); 
     mappings.Conventions.Setup(GetConventions()); 
     mappings.Setup(GetSetup()); 

private Action<IConventionFinder> GetConventions() 
    { 
     return c => 
     { 
      c.Add<PrimaryKeyConvention>(); 
      c.Add<HasManyConvention>(); 
      c.Add<TableNameConvention>(); 
      c.Add<CustomForeignKeyConvention>(); 
      c.Add<SubClassConvention>(); 
     }; 
    } 


    public class PrimaryKeyConvention : IIdConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance) 
     { 
      instance.Column(instance.EntityType.Name + "ID"); 
      instance.UnsavedValue("0"); 
     } 
    } 

    public class HasManyConvention : IHasManyConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance instance) 
     { 
      instance.Key.Column(instance.EntityType.Name + "ID"); 
      instance.Cascade.AllDeleteOrphan(); 
     } 
    } 

    public class TableNameConvention : IClassConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance) 
     { 
      instance.Table(instance.EntityType.Name); 
     } 
    } 

    public class CustomForeignKeyConvention : ForeignKeyConvention 
    { 
     protected override string GetKeyName(Member property, Type type) 
     { 
      return type.Name + "ID"; 
     } 
    } 

    public class SubClassConvention : IJoinedSubclassConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IJoinedSubclassInstance instance) 
     { 
      instance.Table(instance.EntityType.Name); 
      instance.Key.Column(instance.EntityType.BaseType.Name + "ID"); 
     } 

    } 

的問題是,當我保存工作者Indemnifications列表自動映射類: 工人被保存,所以賠償但外鍵(WorkerID)在 賠償表是空的?

+0

是難題:) ????? – 2010-09-05 21:18:39

回答

1

我想通了這個問題:

當你需要它有一個實體保存(一對多)的關係

,你需要打開一個交易並提交:)。

Session.BeginTransaction(); 
Session.Save(entity); 
Session.CommitTransaction(); 
0

Didn't你不知道那是創造了一個一對多的關係,船舶在第一時間爲空,爲什麼自動映射允許外國鍵?

那麼在你的例子中,爲什麼表「Indemnification」中的「workerId」列沒有添加非空約束?

我剛剛遇到了這個問題,我認爲即使它可以在代碼中處理,它應該根本不可能插入空值,對吧?任何解決方案?

+0

不幸的是,我無法找到解決方案,甚至更多,我試圖使Indemnification表中的外鍵列不爲空手動,並且它發生了異常。 – 2010-11-24 08:50:38