Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何微调FluentNHibernate';什么是自动制图器?_.net_Nhibernate_Orm_Fluent Nhibernate_Nhibernate Mapping - Fatal编程技术网

.net 如何微调FluentNHibernate';什么是自动制图器?

.net 如何微调FluentNHibernate';什么是自动制图器?,.net,nhibernate,orm,fluent-nhibernate,nhibernate-mapping,.net,Nhibernate,Orm,Fluent Nhibernate,Nhibernate Mapping,好的,昨天我设法获得了NHibernate和FluentNHibernate的最新主干版本,以配合我最新的小项目。(我正在开发一个bug跟踪应用程序。)我使用Repository模式创建了一个不错的数据访问层 我认为我的实体没有什么特别之处,而且随着当前ORMs的成熟,我不想手工制作数据库。 因此,我选择使用FluentNHibernate的自动映射功能,将NHibernate的“hbm2ddl.auto”属性设置为“create” 它真的很有魅力。我将NHibernate配置放在我的应用程序域

好的,昨天我设法获得了NHibernate和FluentNHibernate的最新主干版本,以配合我最新的小项目。(我正在开发一个bug跟踪应用程序。)我使用Repository模式创建了一个不错的数据访问层

我认为我的实体没有什么特别之处,而且随着当前ORMs的成熟,我不想手工制作数据库。 因此,我选择使用FluentNHibernate的自动映射功能,将NHibernate的“hbm2ddl.auto”属性设置为“create”

它真的很有魅力。我将NHibernate配置放在我的应用程序域的配置文件中,进行设置,然后开始使用它。(目前,我只创建了一些单元测试。)它创建了数据库中的所有表,以及我需要的一切。它甚至正确地映射了我的多对多关系

但是,存在一些小故障:

  • 数据库中创建的所有列都允许null。我知道它不能预测哪些属性应该允许null,哪些不应该,但至少我想告诉它,它应该只允许那些在.NET中null有意义的类型使用null(例如,不可为null的值类型不应该允许null)
  • 它创建的所有nvarchar和varbinary列的默认长度为255。我宁愿把它们放在马克斯身上,而不是那样
有没有办法告诉自动映射器上面的两条简单规则

如果答案是否定的,那么如果我修改它创建的表,它会正常工作吗? (因此,如果我将某些列设置为不允许null,并更改其他列的允许长度,它是否可以正确地使用它们?)

最终编辑: 非常感谢每一位前来帮忙的人。
我在Fluent上的所有问题现在都解决了。

您可以使用自动映射覆盖来更改自动映射器的工作方式,还可以定义约定,这些约定将由自动映射器使用

下面是一个关于如何使用约定和覆盖的示例:

var mappings = new AutoPersistenceModel();
mappings.Conventions.Setup(s => s.Add<ColumnNullabilityConvention>());
mappings.UseOverridesFromAssemblyOf<AssemblyName>();

// This convention will set all properties to be not nullable

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();
   }
}

// This override will change "string" to use "text" instead of "varchar(255)".
// Also set the property to be not nullable

public class SomeOverrideInTheSameAssembly : IAutoMappingOverride<TypeName>
{
   public void Override(AutoMapping<TypeName> mapping)
   {
       mapping.Map(x => x.Property).CustomType("StringClob").CustomSqlType("text");
       mapping.Map(x => x.Property).Not.Nullable();
   }
}    
var mappings=new AutoPersistenceModel();
mappings.Conventions.Setup(s=>s.Add());
mappings.UseOverridesFromAssemblyOf

  • 这并不广为人知,但您可以在配置代码的映射部分设置许多约定,例如:

    Fluently.Configure()
      .Database(/* database config */)
      .Mappings(m =>
      {
        m.FluentMappings
          .AddFromAssemblyOf<Entity>()
          .Conventions.Add(PrimaryKey.Name.Is(x => "ID"));
      })
    

    请参阅FNH wiki上的部分。

    有关Id问题,您需要更改
    FindIdentity
    设置。虽然篇幅很短,但在本手册中有介绍

    应该是这样的:

    AutoMap.AssemblyOf<Entity>() // your usual setup
      .Setup(s =>
      {
        s.FindIdentity = m => m.Name == "ID";
      });
    
    AutoMap.AssemblyOf()//您通常的设置
    .设置(s=>
    {
    s、 FindIdentity=m=>m.Name==“ID”;
    });
    

    这样做的目的是指示自动映射程序在尝试查找ID时使用新的lambda(
    m=>m.Name==“ID”
    m
    是属性/成员,为每个实体上的每个属性调用此lambda;无论您为哪个返回true,都是id。

    非常感谢!我设法让它使用以下代码:persistenceModel.Conventions.Add(ConventionBuilder.Property.Always(x=>x.Length(16000));不过,这有点不妥,因为在SQL Server中,16000会将其设置为最大值,但对于其他数据库服务器可能不太好。有没有一种通用的方法可以做到这一点?不太可能。通常,您应该将其设置为“StringClob”customtype,因为这对NHibernate意味着它是“文本”类型,但即使如此,一些NHibernate数据库提供程序(如PostgreSQL)也会忽略它。这就是为什么在我的覆盖示例中,我同时使用CustomType和CustomSqlType声明将其设置为“text”。或者,如果您更改下面的数据库模式,那么NHibernate不会真正关心它是varchar还是更大的(文本、blob等)。但这也不是一个好的解决方案,因为有很多显而易见的事情。好吧,我暂时不谈这个问题。顺便说一句,很高兴在这里看到另一个匈牙利人。:)非常感谢你的回答。我使用一些自定义约定设法使它工作。然而,在浏览了维基之后,还有一件事让我感到困扰。我无法使PrimaryKey.Name.Is(x=>“ID”)正常工作。抱歉,我从未使用PrimaryKey约定-我只是从wiki复制了示例。可能是个虫子。我建议你在FNH支持论坛上发布一个问题-@James-那么为什么PrimaryKey大会对他不起作用呢?FNH中的臭虫?方法的滥用?
    PrimaryKey
    约定用于指定主键的列,而不是属性。发现该属性是一个纯粹的自动映射练习,而约定应用于类映射和自动映射。感谢您的澄清-猜测这个名称愚弄了Venemo和我。我会修改我的答案。谢谢你,詹姆斯,你的澄清。
    AutoMap.AssemblyOf<Entity>() // your usual setup
      .Setup(s =>
      {
        s.FindIdentity = m => m.Name == "ID";
      });