Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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# Nhibernate正在创建具有对象属性的对象_C#_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# Nhibernate正在创建具有对象属性的对象

C# Nhibernate正在创建具有对象属性的对象,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我刚开始和NHibernate合作。我有两个目标: public class Supplier { public virtual int id{get;set;} public virtual SupplierAddress address{get;set;} public virtual string Name{get;set;} } public class SupplierAddress { public virtual int id{get;set;}

我刚开始和NHibernate合作。我有两个目标:

public class Supplier 
{
    public virtual int id{get;set;}
    public virtual SupplierAddress address{get;set;}
    public virtual string Name{get;set;}
}
public class SupplierAddress 
{
    public virtual int id{get;set;}
    public virtual Supplier{get;set;}
    public virtual string SupplierAddressLine{get;set;}
}
当我想创建一个新的
供应商
时,我会创建一个新对象:

var supplierAddress = new SupplierAddress {
    SupplierAddressLine = "someLine"
}

var supplier = new Supplier 
{
    Name = "someName",
    SupplierAddress = SupplierAddressLine 
}
然后,当我尝试使用以下命令保存时:

_session.Save(supplier);
我得到一个错误:“无法将值NULL插入列'id'

更新1映射 供应商地址


对于供应商


您应该在
供应商
→ <代码>供应商地址关系:

References(s => s.SupplierAddress)
    .Column("SupplierAddressId")
    .Not.Nullable()
    .Cascade.All(); /* Cascade operations that happen on `Supplier` */
否则,NHibernate不知道保存父级(
供应商
)也应该保存子级(
供应商地址

编辑:我认为您实际上在此处错误地使用了
引用

在映射中,当你说一个实体
引用另一个时,你基本上是在告诉NHibernate这个关系的另一边是一个
有很多

在您的情况下,
Supplier
SupplierAddress
实际上都没有多个
SupplierAddress
es或
Supplier
s

考虑到这一点,您可能指的是两件事之一:

  • 一个
    供应商地址
    由多个
    供应商
    共享。这意味着
    供应商地址
    实际上有多个
    供应商
    ,但
    供应商
    只有一个
    供应商地址

    在C类中,这意味着
    供应商地址
    有一个
    供应商的集合
    (或者根本没有提及
    供应商

    在本例中,您的数据库表如下所示:

    public class Supplier
    {   
        public virtual int Id { get; set; }
    
        public virtual SupplierAddress SupplierAddress { get; set; }
    
        public virtual string Name { get; set; }
    }
    
    public class SupplierAddress
    {
        public virtual int Id { get; set; }
    
        public virtual string AddressLine1 { get; set; }
    }
    
    public class SupplierMap : ClassMap<Supplier>
    {
        public SupplierMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            References(s => s.SupplierAddress)
                .Column("SupplierAddressId")
                .Cascade.All();
        }
    }
    
    public class SupplierAddressMap : ClassMap<SupplierAddress>
    {
        public SupplierAddressMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
    
            Map(s => s.AddressLine1)
                .Column("AddressLine1")
                .Not.Nullable()
                .Length(255);
        }
    }
    
    public class Supplier
    {   
        private SupplierAddress supplierAddress;
    
        public virtual int Id { get; set; }
    
        public virtual SupplierAddress SupplierAddress 
        {
            get { return this.supplierAddress; }
            set 
            { 
                this.supplierAddress = value;
                this.supplierAddress.Supplier = this;
            }
        }
    
        public virtual string Name { get; set; }
    }
    
    public class SupplierAddress
    {
        public virtual int Id { get; set; }
    
        public virtual string AddressLine1 { get; set; }
    
        public virtual Supplier Supplier { get; set; }
    }
    
    public class SupplierMap : ClassMap<Supplier>
    {
        public SupplierMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            HasOne(s => s.SupplierAddress).PropertyRef(s => s.Supplier)
                .Access.CamelCaseField()
                .Cascade.All();
        }
    }
    
    public class SupplierAddressMap : ClassMap<SupplierAddress>
    {
        public SupplierAddressMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            Map(s => s.AddressLine1).Column("AddressLine1");
            References(s => s.Supplier).Column("SupplierId").Unique();
        }
    }
    
    创建表[供应商地址]
    (
    [Id]int-identity(1,1)主键群集,
    [AddressLine1]nvarchar(255)不为空
    );
    创建表[供应商]
    (
    [Id]int-identity(1,1)主键群集,
    [SupplierAddressId]int非空引用[SupplierAddress]([Id])
    )
    
    您的C#类将如下所示:

    public class Supplier
    {   
        public virtual int Id { get; set; }
    
        public virtual SupplierAddress SupplierAddress { get; set; }
    
        public virtual string Name { get; set; }
    }
    
    public class SupplierAddress
    {
        public virtual int Id { get; set; }
    
        public virtual string AddressLine1 { get; set; }
    }
    
    public class SupplierMap : ClassMap<Supplier>
    {
        public SupplierMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            References(s => s.SupplierAddress)
                .Column("SupplierAddressId")
                .Cascade.All();
        }
    }
    
    public class SupplierAddressMap : ClassMap<SupplierAddress>
    {
        public SupplierAddressMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
    
            Map(s => s.AddressLine1)
                .Column("AddressLine1")
                .Not.Nullable()
                .Length(255);
        }
    }
    
    public class Supplier
    {   
        private SupplierAddress supplierAddress;
    
        public virtual int Id { get; set; }
    
        public virtual SupplierAddress SupplierAddress 
        {
            get { return this.supplierAddress; }
            set 
            { 
                this.supplierAddress = value;
                this.supplierAddress.Supplier = this;
            }
        }
    
        public virtual string Name { get; set; }
    }
    
    public class SupplierAddress
    {
        public virtual int Id { get; set; }
    
        public virtual string AddressLine1 { get; set; }
    
        public virtual Supplier Supplier { get; set; }
    }
    
    public class SupplierMap : ClassMap<Supplier>
    {
        public SupplierMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            HasOne(s => s.SupplierAddress).PropertyRef(s => s.Supplier)
                .Access.CamelCaseField()
                .Cascade.All();
        }
    }
    
    public class SupplierAddressMap : ClassMap<SupplierAddress>
    {
        public SupplierAddressMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            Map(s => s.AddressLine1).Column("AddressLine1");
            References(s => s.Supplier).Column("SupplierId").Unique();
        }
    }
    
    您的映射如下所示:

    public class Supplier
    {   
        public virtual int Id { get; set; }
    
        public virtual SupplierAddress SupplierAddress { get; set; }
    
        public virtual string Name { get; set; }
    }
    
    public class SupplierAddress
    {
        public virtual int Id { get; set; }
    
        public virtual string AddressLine1 { get; set; }
    }
    
    public class SupplierMap : ClassMap<Supplier>
    {
        public SupplierMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            References(s => s.SupplierAddress)
                .Column("SupplierAddressId")
                .Cascade.All();
        }
    }
    
    public class SupplierAddressMap : ClassMap<SupplierAddress>
    {
        public SupplierAddressMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
    
            Map(s => s.AddressLine1)
                .Column("AddressLine1")
                .Not.Nullable()
                .Length(255);
        }
    }
    
    public class Supplier
    {   
        private SupplierAddress supplierAddress;
    
        public virtual int Id { get; set; }
    
        public virtual SupplierAddress SupplierAddress 
        {
            get { return this.supplierAddress; }
            set 
            { 
                this.supplierAddress = value;
                this.supplierAddress.Supplier = this;
            }
        }
    
        public virtual string Name { get; set; }
    }
    
    public class SupplierAddress
    {
        public virtual int Id { get; set; }
    
        public virtual string AddressLine1 { get; set; }
    
        public virtual Supplier Supplier { get; set; }
    }
    
    public class SupplierMap : ClassMap<Supplier>
    {
        public SupplierMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            HasOne(s => s.SupplierAddress).PropertyRef(s => s.Supplier)
                .Access.CamelCaseField()
                .Cascade.All();
        }
    }
    
    public class SupplierAddressMap : ClassMap<SupplierAddress>
    {
        public SupplierAddressMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            Map(s => s.AddressLine1).Column("AddressLine1");
            References(s => s.Supplier).Column("SupplierId").Unique();
        }
    }
    
    您的C#类将如下所示:

    public class Supplier
    {   
        public virtual int Id { get; set; }
    
        public virtual SupplierAddress SupplierAddress { get; set; }
    
        public virtual string Name { get; set; }
    }
    
    public class SupplierAddress
    {
        public virtual int Id { get; set; }
    
        public virtual string AddressLine1 { get; set; }
    }
    
    public class SupplierMap : ClassMap<Supplier>
    {
        public SupplierMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            References(s => s.SupplierAddress)
                .Column("SupplierAddressId")
                .Cascade.All();
        }
    }
    
    public class SupplierAddressMap : ClassMap<SupplierAddress>
    {
        public SupplierAddressMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
    
            Map(s => s.AddressLine1)
                .Column("AddressLine1")
                .Not.Nullable()
                .Length(255);
        }
    }
    
    public class Supplier
    {   
        private SupplierAddress supplierAddress;
    
        public virtual int Id { get; set; }
    
        public virtual SupplierAddress SupplierAddress 
        {
            get { return this.supplierAddress; }
            set 
            { 
                this.supplierAddress = value;
                this.supplierAddress.Supplier = this;
            }
        }
    
        public virtual string Name { get; set; }
    }
    
    public class SupplierAddress
    {
        public virtual int Id { get; set; }
    
        public virtual string AddressLine1 { get; set; }
    
        public virtual Supplier Supplier { get; set; }
    }
    
    public class SupplierMap : ClassMap<Supplier>
    {
        public SupplierMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            HasOne(s => s.SupplierAddress).PropertyRef(s => s.Supplier)
                .Access.CamelCaseField()
                .Cascade.All();
        }
    }
    
    public class SupplierAddressMap : ClassMap<SupplierAddress>
    {
        public SupplierAddressMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            Map(s => s.AddressLine1).Column("AddressLine1");
            References(s => s.Supplier).Column("SupplierId").Unique();
        }
    }
    
    您的映射如下所示:

    public class Supplier
    {   
        public virtual int Id { get; set; }
    
        public virtual SupplierAddress SupplierAddress { get; set; }
    
        public virtual string Name { get; set; }
    }
    
    public class SupplierAddress
    {
        public virtual int Id { get; set; }
    
        public virtual string AddressLine1 { get; set; }
    }
    
    public class SupplierMap : ClassMap<Supplier>
    {
        public SupplierMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            References(s => s.SupplierAddress)
                .Column("SupplierAddressId")
                .Cascade.All();
        }
    }
    
    public class SupplierAddressMap : ClassMap<SupplierAddress>
    {
        public SupplierAddressMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
    
            Map(s => s.AddressLine1)
                .Column("AddressLine1")
                .Not.Nullable()
                .Length(255);
        }
    }
    
    public class Supplier
    {   
        private SupplierAddress supplierAddress;
    
        public virtual int Id { get; set; }
    
        public virtual SupplierAddress SupplierAddress 
        {
            get { return this.supplierAddress; }
            set 
            { 
                this.supplierAddress = value;
                this.supplierAddress.Supplier = this;
            }
        }
    
        public virtual string Name { get; set; }
    }
    
    public class SupplierAddress
    {
        public virtual int Id { get; set; }
    
        public virtual string AddressLine1 { get; set; }
    
        public virtual Supplier Supplier { get; set; }
    }
    
    public class SupplierMap : ClassMap<Supplier>
    {
        public SupplierMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            HasOne(s => s.SupplierAddress).PropertyRef(s => s.Supplier)
                .Access.CamelCaseField()
                .Cascade.All();
        }
    }
    
    public class SupplierAddressMap : ClassMap<SupplierAddress>
    {
        public SupplierAddressMap()
        {
            Id(s => s.Id).GeneratedBy.Identity().Column("Id");
            Map(s => s.AddressLine1).Column("AddressLine1");
            References(s => s.Supplier).Column("SupplierId").Unique();
        }
    }
    
    公共类供应商映射:类映射
    {
    公共供应商地图()
    {
    Id(s=>s.Id).GeneratedBy.Identity()列(“Id”);
    HasOne(s=>s.SupplierAddress).PropertyRef(s=>s.Supplier)
    .Access.CamelCaseField()
    .Cascade.All();
    }
    }
    公共类SupplierAddressMap:ClassMap
    {
    公共供应商地址映射()
    {
    Id(s=>s.Id).GeneratedBy.Identity()列(“Id”);
    映射(s=>s.AddressLine1)。列(“AddressLine1”);
    引用(s=>s.Supplier).Column(“SupplierId”).Unique();
    }
    }
    
    请注意,当
    Supplier.SupplierAddress
    set
    时,将设置地址的
    Supplier
    属性


  • 您能显示类的映射吗?尝试在id中设置保护集。它说我应该在SupplierAddress中指定供应商idtable@OlegDobra:SupplierAddress.SupplierId不可为空?@OlegDobra:如果两者都不可为空,NHibernate应该如何插入它们?如果您尝试插入供应商t、 您将失败,因为
    供应商地址
    尚不存在。如果您先插入
    供应商地址
    ,则将失败,因为
    供应商
    尚不存在。我建议您删除
    供应商地址.SupplierId
    中的NOTNULL约束,或删除
    供应商地址
    中的引用
    Supplier
    完整。感谢您的建议。在数据库中没有不可为null的约束。但我意外地将其添加到映射中。