CodeFirst中导航属性的代码实现 理解
导航属性是在CodeFirst中,两中数据库表之间,多对多或者1对多中表关联的属性。导航属性并不带有数据,
包括以下信息:
-
名称。 (必需)
-
导航属性要导航的关联。 (必需)
-
导航属性要导航的关联端。 (必需)
对于多对多的导航属性,两张表是可选的。如果对关联一端的某实体类型定义导航属性,则不需要对关联另一端的该实体类型定义导航属性。
导航属性的数据类型是由其远程关联端的重数决定的。
重数:在关联的一端可以存在的实体类型实例的数量。关联端重数可以有以下列值之一:
-
一(1):表明在关联端存在且只存在一个实体类型实例。
-
零或一 (0..1):表明在关联端不存在实体类型实例或存在一个实体类型实例。
-
多 (*):表明在关联端不存在实体类型实例,或者存在一个或多个实体类型实例。
如果是一对多。则如下所示
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中定义。