Pull to refresh

Fluent NHibernate

.NET *
Интересующимся O/R маппингом, а, в частности, NHibernate, будет интересен этот проект.
В первой версии NHibernate существовало две возможности описать O/R преобразование. С помощью атрибутов и в XML файле (более популярный). Наблюдались проблемы с поддержкой и тестированием. Fluent NHibernate позволяет описать преобразование вот таким вот способом:

public CustomerMap : ClassMap<Customer>
{
 public CustomerMap()
 {
  Id(x => x.ID);
  Map(x => x.Name);
  Map(x => x.Credit);
  HasMany<Product>(x => x.Products)
   .AsBag();
  Component<Address>(x => x.Address, m => 
  { 
    m.Map(x => x.AddressLine1); 
    m.Map(x => x.AddressLine2); 
    m.Map(x => x.CityName); 
    m.Map(x => x.CountryName); 
  });
}


Сравните с XML описанием:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  namespace="Eg" assembly="Eg">

  <class name="Customer" table="Customers">
    <id name="ID">
      <generator class="identity" />
    </id>

    <property name="Name" />
    <property name="Credit" />

    <bag name="Products" table="Products">
      <key column="CustomerID"/>
      <one-to-many class="Eg.Product, Eg"/>
    </bag>

    <component name="Address" class="Eg.Address, Eg">
      <property name="AddressLine1" />
      <property name="AddressLine2" />
      <property name="CityName" />
      <property name="CountryName" />
    </component>
  </class>
</hibernate-mapping>


И что самое главное, такой вот код может быть протестирован, примерно так:
[Test]
public void VerifyCustomerSaves()
{
  new PersistenceSpecification<Customer>()
    .CheckProperty(x => x.Name, "James Gregory")
    .CheckProperty(x => x.Age, 22)
    .VerifyTheMappings();
}



Есть, конечно, и неприятные моменты. Проект не закончен и джае не имеет стабильного релиза. Но к проекту можно присоединиться.
Исходный код проекта находится по адресу http://code.google.com/p/fluent-nhibernate/
Tags:
Hubs:
Total votes 7: ↑7 and ↓0 +7
Views 8K
Comments 4
Comments Comments 4

Posts