.net core 导航属性配置 - zLulus/My_Note GitHub Wiki

EF7不再允许隐式调用导航属性

以下示例使用了ABP .net core 2.0的框架

实体定义与配置(fluent api)

一对多

Activity表

public class Activity: FullAuditedEntity<long>
{
    /// <summary>
    /// 评论列表
    /// </summary>
    public List<ActivityComment> ActivityComments { get; set; }
}

ActivityComment表

public class ActivityComment : FullAuditedEntity<long>
{
    /// <summary>
    /// 外键
    /// </summary>
    public long ActivityId { get; set; }
    /// <summary>
    /// 导航属性
    /// </summary>
    public Activity Activity { get; set; }
}

配置

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    //导航属性
    modelBuilder.Entity<ActivityComment>()
                        .HasOne(p => p.Activity)
                        .WithMany(b => b.ActivityComments)
                        .HasForeignKey(p => p.ActivityId);
    modelBuilder.Entity<Activity>()
        .HasMany(x => x.ActivityComments)
        .WithOne(x => x.Activity)
        .HasForeignKey(x => x.ActivityId);
}

查询

必须使用Including显示调用

private readonly IRepository<Activity, long> _activityRepository;
public ActivityManage(IRepository<Activity, long> activityRepository)
{
    _activityRepository = activityRepository;
}

public async Task Test(EntityDto<long> input)
{
    //GetAllIncluding()参数为空,不进行导航属性查询
    var list =await _activityRepository.GetAllIncluding(x=>x.ActivityComments,x=>x.ActivityEvents,x=>x.ActivityInclusions).ToListAsync();
    var entity = _activityRepository.GetAllIncluding(x => x.ActivityComments, x => x.ActivityEvents, x => x.ActivityInclusions).Where(x => x.Id == input.Id).FirstOrDefault();
}

实体定义与配置(annotation)

fluent api和annotation比较

fluent api用于复杂场景,继承,多对多之类的

参考资料

https://docs.microsoft.com/en-us/ef/core/modeling/relationships

Attach方法

用于一对多关系时,对附属多条记录的处理
如果没有id,attach的默认行为是新增
如果有id,attach的默认行为是修改

示例代码

https://github.com/zLulus/NotePractice/blob/dev3/Website/DotNetCore/CoreWebsite/Controllers/DbTestController.cs

⚠️ **GitHub.com Fallback** ⚠️