gpt4 book ai didi

C# 和 EF 无法将相关实体添加到模型

转载 作者:太空狗 更新时间:2023-10-29 22:58:30 26 4
gpt4 key购买 nike

我想获取包含标签的帖子列表。

我有模型:

public class BlogPostGetByUrlSlugDto
{
public int Id { get; set; }
public string Title { get; set; }
public string Category { get; set; }
public string Color { get; set; }
public string UrlSlug { get; set; }
public string Description { get; set; }
public IList<BlogTagGetByPostIdDto> Tags { get; set; }
}

public class BlogTagGetByPostIdDto
{
public string Name { get; set; }
public string UrlSlug { get; set; }
}

到目前为止我的代码:

public BlogPostGetByUrlSlugDto GetByUrlSlug(string urlSlug)
{
var blogPostQuery = _blogPostRepository.Query;

return blogPostQuery
.Where(b => b.UrlSlug.Equals(urlSlug))
.ToList()
.Select(bp => new BlogPostGetByUrlSlugDto
{
Id = bp.Id,
Title = bp.Title,
Category = bp.BlogCategory.Name,
Color = bp.BlogCategory.Color,
UrlSlug = bp.UrlSlug,
Description = bp.Description,
Tags = bp.BlogTags.Select(t => new BlogTagGetByPostIdDto
{
Name = t.Name,
UrlSlug = t.UrlSlug
})
.ToList()
})
.Single();
}

我在 .Select(bp => new BlogPostGetByUrlSlugDto 行中得到 Object reference not set to an instance of an object

知道为什么吗?

_blogPostRepository.QueryRepository 是:

public interface IRepository<T> where T : class
{
T FindById(int id, bool asNoTracking = false);

T FindSingle(Expression<Func<T, bool>> predicate = null, bool asNoTracking = false, params Expression<Func<T, object>>[] includes);

IQueryable<T> Find(Expression<Func<T, bool>> predicate = null, bool asNoTracking = false, params Expression<Func<T, object>>[] includes);


/// <summary>
/// Add entity to the repository
/// </summary>
/// <param name="entity">The entity to add</param>
void Add(T entity);

/// <summary>
/// Attach entity to the repository
/// </summary>
/// <param name="entity">The entity to attach</param>
void Attach(T entity);

bool Exists(T entity);

/// <summary>
/// Updates entity within the repository
/// </summary>
/// <param name="entity">The entity to update</param>
void Update(T entity, bool partial = false);


/// <summary>
/// Mark entity by id to be deleted within the repository
/// </summary>
/// <param name="entity">The entity to delete</param>
void Delete(object id);


/// <summary>
/// Mark entity to be deleted within the repository
/// </summary>
/// <param name="entity">The entity to delete</param>
void Delete(T entity);


/// <summary>
/// Get an item matching the id
/// </summary>
T GetById(int id);

/// <summary>
/// Get an item or itens matching the Expression including opcional parameters
/// </summary>
IList<T> Get(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = "");

/// <summary>
/// Get an item matching to prediate
/// </summary>
//T Get(Func<T, bool> predicate);


/// <summary>
/// Get all the itens matching to prediate
/// </summary>
IList<T> GetAll(Func<T, bool> predicate);


///// <summary>
///// Get all the element of this repository
///// </summary>
///// <returns>Entities list</returns>
IList<T> GetAll();


/// <summary>
/// Allow to send Linq queries to the entity
/// </summary>
IQueryable<T> Query { get; }


/// <summary>
/// Saves the pending changes back into the DataContext.
/// </summary>
void Save();
}

查询的实现:

public class Repository<T> : IRepository<T> where T : class
{
protected DbContext _dataContext;
protected DbSet<T> _dbSet;

public virtual IQueryable<T> Query
{
get
{
return _dbSet;
}
}
}

最佳答案

要在主查询中加载实体(此过程称为 eager loading ),您可以使用 Include() method并将您的收藏作为表达式传递。

要使用 Entity Framework 的一些扩展,记得添加以下命名空间:

using System.Data.Entity;

例如,尝试这样的事情:

var result = _blogPostRepository.Query
.Where(b => b.UrlSlug.Equals(urlSlug))
.Include(b => b.Tags)
.Select(bp => new BlogPostGetByUrlSlugDto
{
Id = bp.Id,
Title = bp.Title,
Category = bp.BlogCategory.Name,
Color = bp.BlogCategory.Color,
UrlSlug = bp.UrlSlug,
Description = bp.Description,
Tags = bp.Tags.Select(t => new BlogTagGetByPostIdDto
{
Name = t.Name,
UrlSlug = t.UrlSlug
})
})
.FirstOrDefault();

return result;

由于您调用了 ToListSingleFistOrDefault 方法,它将执行对数据库的查询。在您的代码中,您调用了 ToList(),它将在数据库中执行查询并执行标签的每个查询(延迟加载)。

阅读这篇文章,了解更多关于如何使用 Earger/Lazy 加载的信息。 http://msdn.microsoft.com/en-us/data/jj574232.aspx

关于C# 和 EF 无法将相关实体添加到模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27755463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com