2010-04-09 19 views
7

Có thể một số trợ giúp, làm cách nào để hướng dẫn tự động hóa không có giá trị cho một cột?Quy ước Tự động hóa Nhibernate thông thường cho trường không rỗng

public class Paper : Entity 
{ 
    public Paper() { } 

      [DomainSignature] 
      [NotNull, NotEmpty] 
      public virtual string ReferenceNumber { get; set; } 

      [NotNull] 
      public virtual Int32 SessionWeek { get; set; } 
} 

Nhưng tôi nhận được như sau:

<column name="SessionWeek"/> 

Tôi biết nó có thể được thực hiện bằng thông thạo bản đồ. nhưng tôi muốn biết điều đó theo cách tự động lập bản đồ theo cách tự động .

Trả lời

4

Cảm ơn bạn. Ngoài ra, đối với tài sản tham khảo ReferenceConvention cần phải được thực hiện. Đây là mã mà làm việc:

public class ColumnNullConvention : IPropertyConvention 
{ 
    public void Apply(IPropertyInstance instance) 
    { 
     if (instance.Property.MemberInfo.IsDefined(typeof(NotNullAttribute), false)) 
      instance.Not.Nullable(); 
    } 

} public class ReferenceConvention : IReferenceConvention 
{ 
    public void Apply(FluentNHibernate.Conventions.Instances.IManyToOneInstance instance) 
    { 
     instance.Column(instance.Property.Name + "Fk"); 


     if (instance.Property.MemberInfo.IsDefined(typeof(NotNullAttribute), false)) 
      instance.Not.Nullable(); 

    } 
} 
0
public class Paper Map : IAutoMappingOverride<Paper > 
{ 
    public void Override(AutoMapping<Paper> mapping) 
    { 
     mapping.Map(x => x.ReferenceNumber).Not.Nullable(); 
    } 
} 

Int32 không thể loại rỗng theo mặc định. Int32? là nullable, vì vậy bạn làm cho nó không nullable chỉ bằng cách xác định nó là Int32.

Bạn có thể sử dụng các quy ước để tự động thực hiện điều này. Tôi không chắc chắn nên sử dụng quy ước nào, nhưng hãy xem FluentNHibernate.Conventions.Instances để tìm đúng quy ước. Nó sẽ trông như thế này

public class ColumnConvention : IColumnConvention 
{ 
    public void Apply(FluentNHibernate.Conventions.Instances.ColumnInstance instance) 
    { 
     if (instance.EntityType.IsDefined(typeof(NotNullAttribute), false)) 
      instance.NotNull = true; 
    } 

    public void Apply(FluentNHibernate.Conventions.Instances.IColumnInstance instance) 
    { 
     return; 
    } 
} 

Chỉ cần thêm quy ước này vào tự động hóa của bạn.

+0

Cảm ơn, Nhưng nếu tôi có nhiều thuộc tính trong nhiều thực thể trong ứng dụng của tôi không phải là rỗng. Tôi có ghi đè tất cả không? Nó không có vẻ đúng với tôi. – Robie

+0

nHibernate Validator là một điều riêng biệt. Bạn sẽ phải kiểm tra các thuộc tính trong automapper của bạn. –

+0

Rất cám ơn bạn đã trả lời. OK. Vì vậy, nó có nghĩa là không có quy ước AutoMapping để chỉ thị Fluent Nhibernate để chỉ định một trường không phải là null khác, sau đó ghi đè tất cả các thuộc tính của ứng dụng của tôi. Điều này cho tôi thấy rằng AutoMap thiếu một tính năng rất cơ bản. Nếu tôi cần phải ovverride mỗi lớp bản đồ như alomost tất cả trong số họ có nhiều hơn hoặc ít hơn "không null" lĩnh vực thì tại sao một người nào đó nên sử dụng automapping trên bản đồ thông thạo. Hãy chia sẻ suy nghĩ của bạn. – Robie

1

Dưới đây là cách tôi làm điều đó, về cơ bản lấy từ liên kết mà bạn nhìn thấy trong mã. Có một số công ước hữu ích khác đó là tốt

HTH,
Berryl

/// <summary> 
/// If nullability for the column has not been specified explicitly to allow NULL, then set to “NOT NULL”. 
/// </summary> 
/// <remarks>see http://marcinobel.com/index.php/fluent-nhibernate-conventions-examples/</remarks> 
public class ColumnNullabilityConvention : IPropertyConvention, IPropertyConventionAcceptance 
{ 
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(x => x.Nullable, Is.Not.Set); 
    } 

    public void Apply(IPropertyInstance instance) 
    { 
     instance.Not.Nullable(); 
    } 
} 
+1

Điều này làm việc tốt nhất cho tôi.Tôi cũng đã thực hiện một quy ước tương tự cho các tham chiếu không-null như đã đề cập trong bài viết khác, nhưng sử dụng định dạng này, chỉ cần thay đổi IPropertyConvention và IPropertyConventionAcceptance để sử dụng IReferenceConvention và IReferenceConventionAcceptance. –

0

tôi thấy thường xuyên hơn không, các cột của tôi không phải là null, vì vậy tôi muốn làm cho hội nghị này và chỉ định các cột như nullable :

/// <summary> 
    /// Indicates that a column should allow nulls 
    /// </summary> 
    [Serializable] 
    [AttributeUsage(AttributeTargets.Property)] 
    public class NullableAttribute : Attribute 
    { 
    } 



public class ColumnIsNotNullByDefaultConvention : IPropertyConvention, IPropertyConventionAcceptance 
    { 
    public void Apply(IPropertyInstance instance) 
    { 
     instance.Not.Nullable(); 
    } 

    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(c => !c.Property.MemberInfo.IsDefined(typeof(NullableAttribute), false)); 
    } 
    } 
1

Nếu bạn chủ yếu là hài lòng với kết quả automapping nhưng đôi khi cần phải ghi đè nó để nói một vài thuộc tính trong một lớp học tôi thấy thực hiện một IAutoMappingOverride cho lớp rằng cách dễ nhất để đạt được điều đó:

public class UserMappingOverride : IAutoMappingOverride<User> 
{ 
     public void Override(AutoMapping<User> mapping) 
     { 
      mapping.Map(x => x.UserName).Column("User").Length(100).Not.Nullable(); 
     } 
} 

Và sau đó sử dụng chúng như thế này:

AutoMap.AssemblyOf<User>().UseOverridesFromAssemblyOf<UserMappingOverride>(); 

Tương tự như ClassMaps - nhưng bạn không cần phải mô tả mọi lĩnh vực trong lớp. Cách tiếp cận này rất giống với cách thức API đầu tiên của API của Entity Framework.