2011-04-16 91 views
0

對不起,英文不好,我對它的理解不好。插入記錄的問題。 Nhibernate

我有幾個實體:目錄和域。 關鍵字段(Id)中的引用不得打敗自動生成的,也就是說,我應該自己寫它們。

下面是代碼實體。

/// <summary> 
/// Вредитель. [KEN] 
/// </summary> 
public class Pest 
{ 
    public virtual long Id {get; set;} 
    public virtaul string Value {get; set;} 
    public virtual string Remark {get; set;} 
} 

public class Damage 
{ 
    public virtual long Id {get; set;}   

    public virtual DamageType DamageType { get; set; } 

    public virtual Int16 DamageYear { get; set; } 

    public virtual Pest FirstPest { get; set; } 

    public virtual byte FisrtDamageExtent { get; set; } 

} 

我用automapping fluentNHibernate。

重疊用於手冊。

public class PestMap : IAutoMappingOverride<Pest> 
{ 
    #region IAutoMappingOverride<Pest> Members 

    public void Override(AutoMapping<Pest> autoMapping) 
    { 
     autoMapping.Id(x => x.Id, "Id").GeneratedBy.Foreign(); 
    } 

    #endregion 
} 

,同時保持在DB

session.Save(
        new Pest(103) 
        { 
          Id = 103, 
          Value = "value3", 
          Remarks = "Remark3" 
        }); 

實體實例得到一個錯誤 - 無法解析屬性:ID。 請告訴我如何解決這個問題。

編輯

科爾W¯¯ 是一個代碼生成模式:

public class ModelGenerator 
{ 
    public AutoPersistenceModel Generate() 
    { 
     var automap = new AutoPersistenceModel(); 

     const string mappingsHbmFolder = @"..\..\Mappings\hbm"; 
     if (!Directory.Exists(mappingsHbmFolder)) 
     { 
      Directory.CreateDirectory(mappingsHbmFolder); 
     } 

     automap.Conventions.AddFromAssemblyOf<ModelGenerator>(); 
     automap.UseOverridesFromAssemblyOf<ModelGenerator>(); 
     automap.AddEntityAssembly(Assembly.GetAssembly(typeof(Activity))) 
      .Where(x => x.Namespace.Contains("Entities")) 
      .IgnoreBase(typeof(HandbookEntity<>)) 
      .IgnoreBase(typeof(HandbookEntity)) 
      .IgnoreBase(typeof(Entity<>)) 
      .IgnoreBase(typeof(Entity)) 
      .IgnoreBase(typeof(EntityWithCoppice)) 
      .IgnoreBase(typeof(EntityWithNumber)) 
      .WriteMappingsTo(mappingsHbmFolder); 
     return automap; 
    } 
} 

運行PROGRAMM

private static Configuration CreateSessionFactory() 
{ 
    var modelGenerator = new ModelGenerator(); 
    return Fluently.Configure() 
      .Database(
         MsSqlConfiguration 
           .MsSql2008 
           .ConnectionString(x => x 
                   .Server(@"crookpc\sqlexpress") 
                   .Database("b1") 
                   .TrustedConnection()) 
           .UseReflectionOptimizer()) 
      .Mappings(m => m.AutoMappings.Add(modelGenerator.Generate())) 
      .ExposeConfiguration(BuildSchema) 
      .BuildConfiguration(); 
} 

private static void BuildSchema(Configuration config) 
{ 
    new SchemaExport(config) 
      .SetOutputFile(@"db.sql") 
      .Create(false, true); 
} 

private static void Main(string[] args) 
{ 
    var sessionFactory = CreateSessionFactory().BuildSessionFactory(); 
     using (var tx = session.BeginTransaction()) 
     { 
       session.Save(
       new Pest(103) 
       { 
         Id = 103, 
         Value = "value3", 
         Remarks = "Remark3" 
       }); 
      tx.Commit(); 
     } 


    Console.WriteLine("Press any key..."); 
    Console.ReadKey(); 
} 

}

你心目中的?

回答

0

我會確保您在創建會話和自動映射時加載覆蓋項。您應該也可以發佈該代碼。這是我講的重點線:

AutoPersistenceModel.UseOverridesFromAssemblyOf<PestMap>() 

編輯:這個
更多信息,可以發現here。具體在「覆蓋」部分。

編輯2:
也請確保它是您正在查看的正確的實體。它抱怨害蟲或傷害中的身份證嗎?您可能想要發佈實際的錯誤消息。

如果此答案可以幫助您將其標記爲答案。

+0

你的意思是我的代碼生成模型,配置和創建會話? – Ilya 2011-04-16 14:49:46

+0

請看我的編輯進一步的細節。 – 2011-04-16 15:04:40

+0

請看編輯帖子。 – Ilya 2011-04-16 17:14:26

0

你可能不想要.GeneratedBy.Foreign(),這意味着ID是由1:1關係的另一端產生的。如果您只是自己分配ID,則應使用.GeneratedBy.Assigned()

+0

如果我使用。 GeneratedBy.Assigned(),那麼我不能寫入ID字段的值。 (在數據庫中它被標記爲只讀)。並且當您將對象保存在數據庫中時ID會自動生成。 – Ilya 2011-04-16 14:32:55