Если вы хотите скрыть эту информацию от вызывающего, вы, очевидно, не ожидаете, что он изменит сущность напрямую. Вы можете создать базовый класс для Foo, который содержит только те свойства, которые должен видеть вызывающий объект.
public abstract class FooBase
{
public string FooName { get; set; }
}
public class Foo : FooBase
{
public int BarCount { get; set; }
}
Затем вы можете вернуть вызывающему объекту экземпляр FooBase, а не Foo. НО, если у вызывающей стороны есть ссылка на ваш объект, он всегда может каким-то образом получить доступ к скрытой информации, используя Reflection.
Другим возможным вариантом было бы объявить интерфейс и сделать так, чтобы Foo реализовал его явно, хотя я не знаю, как EF-Code First отреагирует на это. Я использую подход, при котором я создаю из рук классы POCO и фрагменты отображения (файлы SSDL, CSDL и MSL), из которых я узнал, что EF может работать с типами, помеченными как внутренние. Но я не знаю, относится ли это и к Code-First.