我有以下类型
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;保存该属性信息
答案 0 :(得分:2)
您的代码是正确的。问题是你错误地解释了代码和结果。
使用此属性值创建blog
对象:
var blog = new Blog { BlogId = 1, Url = "MyUrl" };
因此,此对象在内存中,并由上下文跟踪。根据需要,上下文不跟踪Url
属性,但该属性已在内存中,位于Blog
实例中。
您的代码无需从此实例中移除或更改blog
对象或其url
。然后在控制台中显示它。
没有什么奇怪的事情发生。但是,如果Url
已保存到内存数据库中,则代码不会进行测试。
如果要测试它,请尝试在新的blog
实例中从内存数据库中读取对象,在控制台中显示它,然后您将看到空Url
为你期待的。