Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
C# FluentNhibernate自定义主键自动映射-(dis)允许空值_C#_Fluent Nhibernate_Conventions_Automapping_Convention Over Configur - Fatal编程技术网

C# FluentNhibernate自定义主键自动映射-(dis)允许空值

C# FluentNhibernate自定义主键自动映射-(dis)允许空值,c#,fluent-nhibernate,conventions,automapping,convention-over-configur,C#,Fluent Nhibernate,Conventions,Automapping,Convention Over Configur,如果这是可空和不可空数据库字段的硬编码映射方式 // nullable Map(x => x.FirstName) .Nullable(); // not nullable Map(x => x.FirstName) .Not.Nullable(); 自动映射和约定是如何实现的 另外,这并不明显,但我需要它的目的是让nhibernate生成insert sql语句,而不使用主键字段 例如: 如果我希望数据库生成ProductId,而不是 insert into Produ

如果这是可空和不可空数据库字段的硬编码映射方式

// nullable
Map(x => x.FirstName)
  .Nullable();

// not nullable
Map(x => x.FirstName)
  .Not.Nullable();
自动映射和约定是如何实现的

另外,这并不明显,但我需要它的目的是让nhibernate生成insert sql语句,而不使用主键字段

例如: 如果我希望数据库生成ProductId,而不是

insert into Product (ProductId, Name) values (1, 'product name');
NHibernate应生成

insert into Product (Name) values ('product name');

而且,rdbms在这里不应该是一个问题,因为客户端代码不应该关心数据库如何分配它。

使用fluent nhibernate设置生成数据库主键的责任并不能解决您的问题

public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Id(x => x.Id).GeneratedBy.Native();

        Map(x => x.Name).Nullable();
        ...
    }
}
公共类ProductMap:ClassMap
{
公共产品地图()
{
Id(x=>x.Id).GeneratedBy.Native();
Map(x=>x.Name).Nullable();
...
}
}

毕竟,解决方案在于实现IID转换接口。我正在添加一些代码,以防有人发现这很有用

public class PrimaryKeyConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {            
        instance.Column(instance.EntityType.Name + "Id");
        instance.GeneratedBy.Native();
    }
}
它甚至可以与自定义类一起用于生成id

public class PrimaryKeyConvention : FluentNHibernate.Conventions.IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {            
        instance.Column(instance.EntityType.Name + "Id");
        instance.GeneratedBy.Custom(typeof(CustomIdGenerator));
    }
}
public class CustomIdGenerator : NHibernate.Id.IIdentifierGenerator
{

    public object Generate(NHibernate.Engine.ISessionImplementor session, object obj)
    {
        return null; //this should be custom implemented
    }
}

我没有尝试显式映射类,我希望使用自动映射。我尝试使用GeneratedBy.Native()和Nullable()实现IKeyPropertyConvention;但它不起作用。我应该使用另一个接口吗?对我尝试使用的接口进行更正,我使用的是IIdConvention,而不是IKeyPropertyConvention。