映射实体框架4.1中的受保护属性

时间:2011-09-28 16:36:35

标签: c# entity-framework-4.1

我希望在类中有一个受保护的列表,可以通过方法访问。 在这个主题中,我建议我可以在我的模型类中创建一个配置类,我不喜欢它,但只要它有效..所以我有这样的东西:

public class Person
    {
        public int Id { set; get; }
        public string Name { set; get; }

        List<string> _address = new List<string>();

        protected virtual ICollection<string> address { get { return this._address; } }

        [NotMapped]
        public string[] Address { get { return this.address.ToArray(); } }  // I know it's not efficient.. I'll cache it.

        public void AddAddress(string address)
        {
            // some business logic
            this.address.Add(address);
        }

        public class OneMapping : EntityTypeConfiguration<Person>
        {
            public OneMapping()
            {
                this.HasMany(x => x.address);
            }
        }
    }

并在db上下文中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Configurations.Add<Person>(new Person.OneMapping());
   base.OnModelCreating(modelBuilder);
}

当我尝试添加person实例时,db上下文会抛出此异常:

  

导航属性“address”不是类型的声明属性   '人'。验证它是否未被明确排除   模型,它是一个有效的导航属性。

所以不起作用。 试过这个样本:Mapping private properties with EF 4.1 失败并出现同样的错误。

另一个解决方案是使用ObservableCollection,并在事件中连接业务逻辑,但是当EF构造对象时,这个逻辑不需要运行 - 只有当它们由用户构造时...这是不可能的

所以我有点卡在这里..我希望那里的人已经碰到了这个并解决了它。

谢谢!

1 个答案:

答案 0 :(得分:3)

您的导航属性没有setter,因此无法映射。所有映射的属性都必须具有可访问的getter和setter,因为EF可以在实体实现期间分配它们。对于EDMX来说这是真的,其中至少需要私有setter但是在代码的情况下它甚至没有setter也能正常工作。

如果您想要使用映射属性的可访问性,通常EF代码首先不是一个很好的工具。

编辑:

顺便说一下。您的地址不是实体的集合,而是字符串集合 - 也不支持