我希望在类中有一个受保护的列表,可以通过方法访问。 在这个主题中,我建议我可以在我的模型类中创建一个配置类,我不喜欢它,但只要它有效..所以我有这样的东西:
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构造对象时,这个逻辑不需要运行 - 只有当它们由用户构造时...这是不可能的
所以我有点卡在这里..我希望那里的人已经碰到了这个并解决了它。
谢谢!
答案 0 :(得分:3)
您的导航属性没有setter,因此无法映射。所有映射的属性都必须具有可访问的getter和setter,因为EF可以在实体实现期间分配它们。对于EDMX来说这是真的,其中至少需要私有setter但是在代码的情况下它甚至没有setter也能正常工作。
如果您想要使用映射属性的可访问性,通常EF代码首先不是一个很好的工具。
编辑:
顺便说一下。您的地址不是实体的集合,而是字符串集合 - 也不支持