首页 > 代码库 > CodeFirst中导航属性的代码实现 理解

CodeFirst中导航属性的代码实现 理解

 

导航属性是在CodeFirst中,两中数据库表之间,多对多或者1对多中表关联的属性。导航属性并不带有数据,

包括以下信息:

  • 名称。 (必需)

  • 导航属性要导航的关联。 (必需)

  • 导航属性要导航的关联端。 (必需)

对于多对多的导航属性,两张表是可选的。如果对关联一端的某实体类型定义导航属性,则不需要对关联另一端的该实体类型定义导航属性。

导航属性的数据类型是由其远程关联端的重数决定的。

重数:在关联的一端可以存在的实体类型实例的数量。关联端重数可以有以下列值之一:

  • 一(1):表明在关联端存在且只存在一个实体类型实例。

  • 零或一 (0..1):表明在关联端不存在实体类型实例或存在一个实体类型实例。

  • 多 (*):表明在关联端不存在实体类型实例,或者存在一个或多个实体类型实例。

 

如果是一对多。则如下所示

image

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Nop.Core.Domain.Localization;
using Nop.Core.Domain.Seo;
using Nop.Core.Domain.Stores;

namespace Nop.Core.Domain.Examination
{
    public partial class School : BaseEntity
    {
        /// <summary>
        /// 获取或设置学校名
        /// </summary>
        public string SchoolName { get; set; }

        /// <summary>
        /// 获取或设置创建时间
        /// </summary>
        public DateTime CreateOnUtc { get; set; }

        /// <summary>
        /// 导航属性
        /// </summary>
        public ICollection<Major> Majors { get; set; }

    }
}

下面是Major的Domain文件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Nop.Core.Domain.Localization;
using Nop.Core.Domain.Seo;
using Nop.Core.Domain.Stores;

namespace Nop.Core.Domain.Examination
{
    public partial class School : BaseEntity
    {
        /// <summary>
        /// 获取或设置学校名
        /// </summary>
        public string SchoolName { get; set; }

        /// <summary>
        /// 获取或设置创建时间
        /// </summary>
        public DateTime CreateOnUtc { get; set; }

        /// <summary>
        /// 导航属性
        /// </summary>
        public ICollection<Major> Majors { get; set; }

    }
}

 

 

接下来是两的关系,Mapping映射文件


using Nop.Core.Domain.Examination;
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Nop.Data.Mapping.Examination
{
    public partial class SchoolMap : EntityTypeConfiguration<School>
    {

        public SchoolMap()
        {
            this.ToTable("School");
            this.HasKey(c => c.Id);
            this.Property(c=>c.CreateOnUtc).IsRequired();
            this.Property(c => c.SchoolName).IsRequired().HasMaxLength(1000);
            
        }

    }
}

using Nop.Core.Domain.Examination;
using System;
using System.Collections.Generic;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Nop.Data.Mapping.Examination
{

    public partial class MajorMap : EntityTypeConfiguration<Major>
    {

        public MajorMap()
        {
            this.ToTable("Major");
            this.HasKey(c=>c.Id);
            this.Property(p => p.MajorName).HasMaxLength(1000);
            this.HasOptional(l => l.School)
                .WithMany()
                .HasForeignKey(l => l.SchoolId)
                .WillCascadeOnDelete(true);
               
        }

    }
}

上图中是二个实体的数据库关系图,Shool,Major。导航属性是在Major上定义的。同时也要在School中定义。