首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用“实体框架核心”(又名EF7)实现“软删除”?

如何使用“实体框架核心”(又名EF7)实现“软删除”?
EN

Stack Overflow用户
提问于 2016-06-21 05:48:40
回答 1查看 4.1K关注 0票数 2

我正在尝试使用EF7实现一个“软删除”。我的Item表有一个名为IsDeleted的字段,类型为bit。我在SO周围和其他地方看到的所有示例都使用了这样的东西:

代码语言:javascript
复制
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Item>().Map(m => m.Requires("IsDeleted").HasValue(false));
}

但是Map()不再是ModelBuilder的一种方法。

编辑:让我澄清一下。我现在最感兴趣的只是读取数据。我想让EF自动过滤掉我的Item表中IsDeleted == 1 (或true)的所有记录。我不希望在每个查询的末尾都需要一个&& x.IsDeleted == false

EN

回答 1

Stack Overflow用户

发布于 2017-08-16 01:28:13

如果您可以迁移到EF Core2.0,则可以使用模型级查询过滤器https://docs.microsoft.com/en-us/ef/core/what-is-new/index

如果你使用EF Core 1.0,你可以使用一些可用的EF Core特性:

继承https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/inheritance

阴影属性https://docs.microsoft.com/en-us/ef/core/modeling/shadow-properties

代码语言:javascript
复制
public class Attachment : AttachmentBase
{}

public abstract class AttachmentBase
{
    public const string StatePropertyName = "state";

    public Guid Id { get; set; }
}

public enum AttachmentState
{
    Available,
    Deleted
}

public class AttachmentsDbContext : DbContext
{
    public AttachmentsDbContext(DbContextOptions options)
        : base(options)
    {
    }

    public DbSet<Attachment> Attachments { get; set; }

    public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
    {
        IEnumerable<EntityEntry<Attachment>> softDeletedAttachments = ChangeTracker.Entries<Attachment>().Where(entry => entry.State == EntityState.Deleted);

        foreach (EntityEntry<Attachment> softDeletedAttachment in softDeletedAttachments)
        {
            softDeletedAttachment.State = EntityState.Modified;
            softDeletedAttachment.Property<int>(AttachmentBase.StatePropertyName).CurrentValue = (int)AttachmentState.Deleted;
        }
        return base.SaveChangesAsync(cancellationToken);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AttachmentBase>()
            .HasDiscriminator<int>(AttachmentBase.StatePropertyName)
            .HasValue<Attachment>((int)AttachmentState.Available);

        modelBuilder.Entity<AttachmentBase>().Property<int>(AttachmentBase.StatePropertyName).Metadata.IsReadOnlyAfterSave = false;

        modelBuilder.Entity<Attachment>()
            .ToTable("available_attachment");

        modelBuilder.Entity<AttachmentBase>()
            .ToTable("attachment");

        base.OnModelCreating(modelBuilder);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37932339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档