2012-02-02 16 views
7

Şu anda şuna benzer bir Akıcı N hazırda alt sınıf eşleme oluşturma:Fluent Nhibernate Table-Per-Subclass stratejisini kullanırken kimlik sütununu belirtebilir misiniz?

Test.TaskRepositoryTest.DeleteTest: 
NHibernate.Exceptions.GenericADOException : could not insert: [TaskManager.Entities.TaskDownload#269][SQL: INSERT INTO TasksDownload (ExtraProperty1, ExtraProperty2, Task_id) VALUES (?, ?, ?)] 
    ----> System.Data.SqlClient.SqlException : Invalid column name 'Task_id'. 

O Id çünkü var:

public class TaskDownloadMap: SubclassMap<TaskDownload> 
{ 
    public TaskDownloadMap() 
    { 
     Table("TasksDownload"); 

     Map(x => x.ExtraProperty1, "ExtraProperty1") 
      .Nullable(); 

     Map(x => x.ExtraProperty2, "ExtraProperty2") 
      .Nullable(); 
    } 
} 

denemek ve bu varlıklar birini kurtarmak istisna almak alt sınıfımın tablosuna koyduğum sütun "TaskId" olarak adlandırılmıştır. Nhibernate'in kullanmaya çalıştığı varsayılan adlandırma şemasını geçersiz kılacak bazı var mı? Alt sınıftaki "Id" sütununu belirleme yeteneğine sahip değilim ve başka birisini bu konuda konuşamıyorum.

ebeveyn haritalama şuna benzer:

public class TaskMap: ClassMap<Task> 
{ 
    public TaskMap() 
    { 
     Table("Tasks"); 

     Id(x => x.Id, "Id") 
      .GeneratedBy.Identity(); 

     . 
     . 
     . 

    } 
} 

Bunları 2 farklı tablolar vardır bu yüzden Tablo-Per-Altsınıf stratejisi ile gidiyorum önce söylediğim gibi. TasksDownload tablosumdaki anahtarı "Task_id" olmak için değiştirebilirim ancak eşleme konumumda "TaskId" olduğunu belirtebilmem için adlandırma düzenime devam edebilirim.

+0

nasıl hiyerarşidir benziyor? Üst haritalamayı yayınlayabilir misiniz? Ebeveyn eşlemesine sahip olmak için – nemesv

+0

Düzenlenmiş gönderi. –

cevap

4

Alt sınıf kimliklerini akıcı API ile yapılandıramazsınız, çünkü yerleşik eşleme konveksiyonları tarafından işlenir. Ancak özel bir convention yazabilirsiniz (gerekiyorsa bazı ek acceptance ile birlikte).
Bir numune çözeltisi:

public class JoinedSubclassIdConvention : IJoinedSubclassConvention, 
    IJoinedSubclassConventionAcceptance 
{ 
    public void Apply(IJoinedSubclassInstance instance) 
    { 
     instance.Key.Column(instance.EntityType.BaseType.Name + "Id"); 
    } 

    public void Accept(IAcceptanceCriteria<IJoinedSubclassInspector> criteria) 
    { 
     criteria.Expect(x => x.EntityType == typeof(TaskDownload)); 
    } 
} 

Sonra yapılandırma için convetion ekleyin:

Fluently.Configure() 
    //... 
    .Mappings(m => 
     { 
      m.FluentMappings 
      //... 
      .Conventions.Add<JoinedSubclassIdConvention>(); 
     }); 
+0

Çözümünüzü denediniz ve bir çekicilik gibi çalıştı. Yardım için teşekkürler. –

+0

Gerçekten eski bir soru, ama yine de alakalı. Bu neden sadece harita başına bir yöntem olarak değil, bir kural olarak yapılandırılabilir? – shortstuffsushi

İlgili konular