如何排除EF 7中的属性?

时间:2015-11-27 10:03:24

标签: entity-framework entity-framework-core

我有以下类型

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

我有以下背景

public class MyContext : DbContext
{
    public MyContext(DbContextOptions options)
        : base(options)
    {

    }
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        modelBuilder.Entity<Blog>().Ignore(x => x.Url);
    }
}

我正在尝试使用fluent API排除属性。我假设当我们在EF中排除类型的属性时,它将无法将该属性读取/保存到数据库。

在下面的代码示例中,我使用的是InMemory DB&amp;排除了Url Property。

class Program
    {
        static void Main(string[] args)
        {

            var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
            optionsBuilder.UseInMemoryDatabase();

            using (var db = new MyContext(optionsBuilder.Options))
            {
                var blog = new Blog { BlogId = 1, Url = "MyUrl" };

                db.Blogs.Add(blog);
                db.SaveChanges();

                foreach (var item in db.Blogs)
                {
                    Console.WriteLine(item.BlogId);

                    Console.WriteLine(item.Url);
                }
                Console.ReadLine();
            }


        }
    }

在输出中,我可以看到EF能够读取&amp;保存该属性信息

enter image description here

1 个答案:

答案 0 :(得分:2)

您的代码是正确的。问题是你错误地解释了代码和结果。

使用此属性值创建blog对象:

var blog = new Blog { BlogId = 1, Url = "MyUrl" };

因此,此对象在内存中,并由上下文跟踪。根据需要,上下文不跟踪Url属性,但该属性已在内存中,位于Blog实例中。

您的代码无需从此实例中移除或更改blog对象或其url。然后在控制台中显示它。

没有什么奇怪的事情发生。但是,如果Url已保存到内存数据库中,则代码不会进行测试。

如果要测试它,请尝试在新的blog实例中从内存数据库中读取对象,在控制台中显示它,然后您将看到空Url为你期待的。