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

C# 在实体框架4.1中映射受保护的属性,c#,entity-framework-4.1,C#,Entity Framework 4.1,我想在类中有一个受保护的列表,可以通过方法访问。 在本主题中,有人建议我可以在我的模型类中创建一个配置类,我并不喜欢它,但只要它能工作。。所以我有一些类似的东西: public class Person { public int Id { set; get; } public string Name { set; get; } List<string> _address = new List<string>();

我想在类中有一个受保护的列表,可以通过方法访问。 在本主题中,有人建议我可以在我的模型类中创建一个配置类,我并不喜欢它,但只要它能工作。。所以我有一些类似的东西:

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);
            }
        }
    }
公共类人物
{
公共int Id{set;get;}
公共字符串名称{set;get;}
列表_地址=新列表();
受保护的虚拟ICollection地址{get{返回此地址。_address;}
[未映射]
public string[]Address{get{返回this.Address.ToArray();}}//我知道它效率不高。我会缓存它。
公共无效地址(字符串地址)
{
//一些商业逻辑
本.地址.添加(地址);
}
公共类OneMapping:EntityTypeConfiguration
{
公共地图
{
this.HasMany(x=>x.address);
}
}
}
在db上下文中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Configurations.Add<Person>(new Person.OneMapping());
   base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(newperson.OneMapping());
基于模型创建(modelBuilder);
}
当我尝试添加person的实例时,db上下文引发此异常:

导航属性“address”不是类型的声明属性 “人”。验证是否未将其明确排除在 模型,并且它是有效的导航属性

所以这不起作用。 尝试此示例: 由于相同的错误而失败

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

所以我有点被困在这里。。我希望外面已经有人发现并解决了这个问题

谢谢

导航属性没有setter,因此无法映射。所有映射属性都必须具有可访问的getter和setter,因为EF可以在实体物化期间分配它们。这对于EDMX是正确的,在EDMX中至少需要私有setter,但在代码优先的情况下,即使没有setter,它也可以工作

如果您想使用映射属性的可访问性,通常EF code first不是很好的工具

编辑:


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

不,我想映射受保护的属性-这就是地址。是的,字符串。。。一定是被屏蔽了几分钟:)将其更改为Id为的对象,并且成功了。顺便说一句,集合属性不需要setter,EF使用Add()填充它。字符串集合无法映射和持久化。EF不知道如何处理。是的,我知道,我是说集合属性不需要设置器。我修改了答案。您是对的,在代码中不需要第一个setter。