相关疑难解决方法(0)

为实体框架制作全局过滤器

对于我的模型,我有一个active关于所有模型的属性,并且我想过滤所有非活动的,如果模型没有在管理上显示什么是最好的方法,我目前使用的是以下

在我的基础模型类中,我有这个过滤集合的方法

public virtual IQueryable<T> GlobalDefaultScope<T>(IQueryable<T> c) where T : CModel<T>
{
    if (settings.is_admin)
    {
        c = c.Where(m => m.active);
    }
    return c;
}
Run Code Online (Sandbox Code Playgroud)

在每个关系的模型上,我做了以下方法

DbSet<T> set ...
var X = set.Where(some filter);
var list = globalDefaultScope(X).ToList();
return list;
Run Code Online (Sandbox Code Playgroud)

现在我有一些严重的问题,当我想急切地加载一些子关系使用include("Xmodel.Ymodel")globalDefaultScope在该get集合的方法中调用过滤集合,但是当集合中的某些项目处于非活动状态时它会继续抛出此异常

System.InvalidOperationException: 操作失败:无法更改关系,因为一个或多个外键属性不可为空.

我怎么能解决这个问题,或者我怎么能以更优雅的方式制作这个过滤器,因为我真的不太满意我是如何实现它的.

请询问任何遗漏的信息或代码块或任何细节

更新:

我也找到了这个链接,但这种方式不适用于急切加载的条目(include())

UPDATE2:

这是我如何使用包含和错误发生的示例

在我的模型中

public IQueryable<Dish> getSomeRelation(bool eagerly_load_sub_relation1, bool eagerly_load_sub_relation2)
        {
            var query = getQuery(...);
            //getQuery =>  query = db.Entry(obj).Collection(collection).Query() 
            //GlobalDefaultScope(query)
            if ( …
Run Code Online (Sandbox Code Playgroud)

c# linq asp.net-mvc entity-framework

9
推荐指数
1
解决办法
9312
查看次数

使用ExpressionVisitor排除连接中的软删除记录

我有一个框架,在数据库中实现软删除(Nullable DateTime称为DeletedDate).我正在使用Repository来处理主要实体请求,如下所示:

/// <summary>
/// Returns a Linq Queryable instance of the entity collection.
/// </summary>
public IQueryable<T> All
{
    get { return Context.Set<T>().Where(e => e.DeletedDate == null); }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但我遇到的问题是当你包含导航属性时,以及如何确保只查询活动记录.有问题的存储库方法如下所示:

/// <summary>
/// Returns a Linq Queryable instance of the entity collection, allowing connected objects to be loaded.
/// </summary>
/// <param name="includeProperties">Connected objects to be included in the result set.</param>
/// <returns>An IQueryable collection of entity.</returns>
public IQueryable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties)
{
    IQueryable<T> query = Context.Set<T>().Where(e => …
Run Code Online (Sandbox Code Playgroud)

c# linq entity-framework ef-code-first

7
推荐指数
1
解决办法
1974
查看次数

实体框架:导航属性问题

我正在使用Entity Framework代码优先,我有一个Course具有导航属性的类Students:

public virtual Collection<Student> Students { get; set;}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但是当我访问此导航属性时,将从数据库中检索所有数据:

var allStudents = course.Students; // Here it retrieves the data
var activeStudents = allStudents.Where(n => n.Active); // Here it filter the data on memory
var listOfActiveStudents = activeStudents.ToList(); // It already has the data on memory.
Run Code Online (Sandbox Code Playgroud)

您可以想象,我需要在执行此操作时执行查询,.ToList()因为我不想Students从数据库中获取所有数据,只有活动数据库.

你知道我做错了什么吗?

.net entity-framework ef-code-first dbcontext

6
推荐指数
1
解决办法
3232
查看次数

覆盖 LINQ .Inlude(),可能吗?

我已经在互联网上浏览这个问题相当长一段时间了,但我得到的与重写 LINQ 方法有关的结果要少得多。我不确定是否可以做到,但我想知道是否有人可以确认这是否有效,或者提出替代方案。

情况如下(当然针对这个问题进行了简化)

我们使用 EF6 Code First 来构建我们的数据库。我们添加了一个自定义(抽象)基类,所有实体均从中派生。该基类实现了我们用于审核的一些字段(创建日期、创建者、修改日期……),但我们还通过在基类中添加IsDeleted (bool) 属性来实现软删除系统。

据我们的应用程序所知,IsDeleted绝不能返回带有 == true 的项。

DataModel 如下(再次简化)

Company
    ---> 1 Company has many Departments
    Department
        ---> 1 Department has many Adresses
        Address
Run Code Online (Sandbox Code Playgroud)

过去,我尝试创建一个通用的检索方法,通过创建对 DataContext 中的表的“覆盖”(也是一个自定义类,因为它自动处理审核字段)来消除 IsDeleted 对象。

对于在 DataContext 中找到的每个表:

public DbSet<Company> Companies { get; set; }
Run Code Online (Sandbox Code Playgroud)

我们添加了第二个表,仅返回未删除的项目。

public IQueryable<Company> _Companies 
{
    get { return this.Companies .Where(co => !co.IsDeleted); }
}
Run Code Online (Sandbox Code Playgroud)

所以我们调用MyDataContext._Companies而不是MyDataContext.Companies. 这按预期工作。它很好地过滤掉了已删除的项目。

然而,我们注意到随后的声明却并非如此.Include()。如果我打电话:

var companies = MyDataContext._Companies.Include(x => x.Departments);

//... …
Run Code Online (Sandbox Code Playgroud)

c# linq linq-to-entities entity-framework

5
推荐指数
1
解决办法
2216
查看次数

如何让Entity Framework返回带有某些默认值的相关对象?

假设我有项目和任务EF代码的第一个类

public class Project
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Task> Tasks { get; set; }
    }

    public class Task
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int ProjectId { get; set; }
        public bool IsDeleted {get; set;}
        public virtual Project Project { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

说我有

public void SomeAction()
{
Project p= repository.GetById(1);
var tasks = p.Tasks;
//var …
Run Code Online (Sandbox Code Playgroud)

entity-framework

4
推荐指数
2
解决办法
3438
查看次数

EF 5条件映射

我在我的MVC应用程序中使用EF 5数据库第一种方法.我的所有表都使用一个名为Deleted的字段,这是一个标记记录被删除的布尔字段.

我试图摆脱每次查询我的数据库时必须检查Deleted == false的要求.这种非常简单的方法是在edmx文件中使用条件映射,其中EF始终返回未删除的数据.这一切都很好.

但是,这个条件映射的问题是,当我想允许用户从地址簿中删除例如地址的某些记录时,我无法访问EF中的删除字段,因为我在条件映射中使用它,因此我必须寻找另一个允许用户删除记录的选项.

我想的方法是创建一个处理删除查询的存储过程,并在我想要删除记录时调用它.

有没有更好的方法呢?是否可以使删除字段可访问,即使它在条件映射中使用?

c# entity-framework asp.net-mvc-4

4
推荐指数
1
解决办法
2771
查看次数

通用存储库模式软删除

我已经创建了一个通用存储库(使用EF 6.1.1),我在几个项目中使用它并且它运行良好.我已经实现了一个"软"删除功能,我们将数据标记为已删除,但实际上并未将其从数据库中删除.

然后,我可以过滤所有查询,因为所有实体都从具有IsDeleted属性的基本实体继承.这一切都很好,但它显然不会过滤掉任何"软删除"的子实体.

我不确定如何以通用方式执行此操作,因为我不希望将解决方案编码到每个respoitory中,这实际上违背了具有通用repo的原因.

这是我目前的通用回购的一个例子

public sealed class MyRepository<T> : IRepository<T> where T : BaseEntity
{
    public String CurrentUser { get; set; }
    private readonly MyObjectContext context;

    private readonly Configuration configuration = ConfigurationManager.GetConfiguration();
    private IDbSet<T> entities;
    private IDbSet<T> Entities
    {
        get { return entities ?? (entities = context.Set<T>()); }
    }

    public MyRepository(MyObjectContext context, String userName = null)
    {
        this.context = context;

        var providerManager = new DataProviderManager(configuration);
        var dataProvider = (IDataProvider)providerManager.LoadDataProvider();
        dataProvider.InitDatabase();

        CurrentUser = userName;
    }

    public void Dispose()
    {
        //do …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework repository-pattern c#-4.0

4
推荐指数
1
解决办法
3213
查看次数

实体框架向所有查询添加where子句

我有一个使用实体框架和 AspNet Identity 的项目。

IdentityUser 的参数之一是停用字段。

在应用程序中,如果我想获得用户,我会这样做:

var users = Context.Users //etc....
Run Code Online (Sandbox Code Playgroud)

但是,我不希望此查询返回任何已停用的用户。我知道我可以做到这一点

var users = Context.Users.Where(x => x.Deactivated != true);
Run Code Online (Sandbox Code Playgroud)

然而,我不愿意这样做,因为我确信有一天有人会忘记添加这个 where 子句。

有没有办法让实体对所有上下文查询自动执行此操作?我发现了这个:

https://learn.microsoft.com/en-us/ef/core/querying/filters

但我没有 EF core,无法升级到它。

我知道我可以制作一个包装函数并调用它,但我正在尝试找到更好的解决方案......

c# linq entity-framework

2
推荐指数
1
解决办法
2484
查看次数