2010-08-26 28 views
5

Tôi có hai bảng, địa điểm và thiết bịthành thạo NHibernate automapping không tạo tên bảng Plural

Họ bản đồ để hai lớp,

public Location : Entity 
{ 
    //properties 
} 

public Facility : Entity 
{ 
    public virtual Location Location { get; set; } 
} 

Tất cả mọi thứ hoạt động giống dandy, cho đến khi tôi thay đổi cơ sở để

này
public Facility : Location 
{ 

} 

Bây giờ tôi có ngoại lệ từ nHibernate nói

NHibernate.ADOException was unhandled by user code 
    Message=could not execute query 
InnerException: System.Data.SqlClient.SqlException 
     Message=Invalid object name 'Facility'. 

Vì một số lý do, nó không tạo tên số nhiều của bảng vào chuỗi sql.

Cảm ơn bạn đã trợ giúp!

EDIT

Đây là TableNameConvention hiện tại của tôi

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

Khi cơ sở kế thừa từ Entity, Quỹ không chạy qua phương pháp này. Khi nó được thừa hưởng từ Vị trí, nó không

Chỉnh sửa 2 figured tôi muốn gửi tất cả mọi thứ ... Database diagram

public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator 
{ 

    #region IAutoPersistenceModelGenerator Members 

    public AutoPersistenceModel Generate() 
    { 
     var mappings = new AutoPersistenceModel(); 
     mappings.AddEntityAssembly(typeof(Person).Assembly).Where(GetAutoMappingFilter); 
     mappings.Conventions.Setup(GetConventions()); 
     mappings.Setup(GetSetup()); 
     mappings.IgnoreBase<Entity>(); 
     mappings.IgnoreBase(typeof(EntityWithTypedId<>)); 
     mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>(); 

     return mappings; 

    } 

    #endregion 

    private Action<AutoMappingExpressions> GetSetup() 
    { 
     return c => 
     { 
      c.FindIdentity = type => type.Name == "Id"; 
     }; 
    } 

    private Action<IConventionFinder> GetConventions() 
    { 
     return c => 
     { 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.ForeignKeyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.HasManyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.HasManyToManyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.ManyToManyTableNameConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.PrimaryKeyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.ReferenceConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.TableNameConvention>(); 
     }; 
    } 

    /// <summary> 
    /// Provides a filter for only including types which inherit from the IEntityWithTypedId interface. 
    /// </summary> 

    private bool GetAutoMappingFilter(Type t) 
    { 
     return t.GetInterfaces().Any(x => 
             x.IsGenericType && 
             x.GetGenericTypeDefinition() == typeof(IEntityWithTypedId<>)); 
    } 
} 
+0

Lưu loát NHibernate không làm bất kỳ số nhiều tên bảng nào, hoặc bất kỳ thứ gì khác cho vấn đề đó. Bạn cần phải tạo ra một quy ước như David đề xuất và sử dụng một trong các .Net inflectors ra khỏi đó. –

+0

tableNameConvention là ở đó, nhưng vì một số lý do khi tôi thay đổi cơ sở để kế thừa từ vị trí, thiết lập thông thạo không còn tìm thấy nó khi nó quét lắp ráp. –

+0

Giống như, có vẻ như bạn đang coi Vị trí là một lớp cơ sở khác, trong trường hợp này, điều sau có thể hoạt động: mappings.IgnoreBase (); Hoặc đang đi cho một cái gì đó giống như một bảng cho mỗi phân lớp? – David

Trả lời

8

Bạn đã thiết lập một convention?

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance) 
    { 
     string typeName = instance.EntityType.Name; 

     instance.Table(Inflector.Net.Inflector.Pluralize(typeName)); 
    } 
} 
+0

Có điều đó. Vì một lý do nào đó khi tôi thay đổi Cơ sở để kế thừa từ vị trí Cơ sở không hiển thị để được thêm vào trong quy ước tên bảng này. –

+0

Euh, thú vị. Vì vậy, bạn đang sử dụng một chiến lược thừa kế? - http://jagregory.com/writings/fluent-nhibernate-auto-mapping-and-base-classes/ – David

+0

Đúng. Nó trông giống như một trong ví dụ. Đây là một liên kết: http://yfrog.com/1gdhfp –

1

Đây là một câu hỏi cũ, nhưng vì lợi ích của những người khác sau khi vấp ngã này tìm kiếm một câu trả lời, bạn cũng có thể tạo ra một quy ước có sử dụng được xây dựng trong PluralizationService mà đi kèm với EF:

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(IClassInstance instance) 
    { 
     string typeName = instance.EntityType.Name; 
     instance.Table(PluralizationService.CreateService(CultureInfo.CurrentCulture).Pluralize(typeName)); 

    } 
} 
+0

Kết hợp thú vị của nhibernate và EF. Chúng tôi không được phép sử dụng EF cho dự án này nhiều năm trước. –

Các vấn đề liên quan