在C#中使用NHibernate为值对象配置复杂类型

Tấn*_*ang 5 .net c# domain-driven-design fluent-nhibernate

当我尝试使用NHibernate流畅配置表(使用代码优先)时,我是DDD和NHibernate的新手。

在EntityFramework中,我们可以使用ComplexTypeConfiguration来配置值对象,并在许多表中使用该配置,但是我不知道NHibernate如何为EntityFramework等值对象分离配置。

internal class EmployeeConfiguration : ClassMap<Employee>
{
    public EmployeeConfiguration()
    {
        Table("Employees");
        Id(emp => emp.Id).GeneratedBy.Identity();

        Component(emp => emp.FullName, name =>
        {
            name.Map(ele => ele.FirstName).Column("FirstName").Length(255).Not.Nullable();
            name.Map(ele => ele.LastName).Column("LastName").Length(255).Not.Nullable();
            name.Map(ele => ele.MiddleName).Column("MiddleName").Length(255).Nullable();
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

我用Google搜索了解决方案,但没有什么真正的帮助。

非常感谢任何帮助,谢谢。

小智 1

据我了解,您需要一个可重用的 ComplextType 配置,可以在各种表上实现。到目前为止一切 顺利,根据“如果您要映射一个实体,您将使用 ClassMap,如果您要映射一个值对象,您将使用 ComponentMap 类”。因此,我基于它构建了一个解决方案,也许这不是正确的答案,但希望这会有所帮助。

//Complex type class
public class Address
{
    public virtual string City { get; set; }
    public virtual string Street { get; set; }
    public virtual string StateOrProvince { get; set; }
    public virtual string Country { get; set; }
}

//Entity
public class Employee
{
    public virtual int Id { get; set; }
    public virtual string FullName { get; set; }
    public virtual Address Address { get; set; }
    public virtual decimal Salary { get; set; }
}

//ComplexTypeConfiguration
public class AddressMap : ComponentMap<Address>
{
   public AddressMap()
   {
       Map(c => c.City).Column("City").Length(255).Not.Nullable();
       Map(c => c.Country).Column("Country").Length(255);
       Map(c => c.StateOrProvince).Nullable();
       Map(c => c.Street).Nullable();
   }
}

//Mapping
public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Table("Employees");

        Id(c => c.Id);
        Map(c => c.FullName);
        Map(c => c.Salary);
        Component(c => c.Address);
    }
}

//Connection string
public class NHibernateHelper
{
    public static ISession OpenSession()
    {
        ISessionFactory sessionFactory = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2012
            .ConnectionString(@"Server=.;Database=TestDB;Trusted_Connection=True;")
            .ShowSql())
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<EmployeeMap>())
            .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true))
            .BuildSessionFactory();

        Console.WriteLine("Database Connected");
        return sessionFactory.OpenSession();
    }
}    

//Test script    
static void Main(string[] args)
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
        Employee employee = new Employee()
        {
            Id = 1,
            FullName = "Nidust Ashen",
            Salary = 12345678,
            Address = new Address()
            {
                City = "test1",
                Street = "test2",
                Country = "test3",
                StateOrProvince = "test4",
            }
        };

        session.Save(employee);
        Console.WriteLine("Done!");
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后结果:

在此输入图像描述

结果