上下文 我试图使用相同的模型集进行XML反序列化和EF 4.1持久性数据。 我无法更改现有的XSD或数据库架构。
问题: 对于一些模型,XML结构不能很好地与表结构对齐。目前,在(基于XML的)模型中将数据库一对多关系定义为父子子级的三级层次结构。这会导致错误:
表达式&t; t => t.PhysicalDetails.PhysicalFeatures' 不是有效的属性表达式。
参与者
class Participant {
public PhysicalDetailsType PhysicalDetails { get; set; }
}
PhysicalDetailsType
class PhysicalDetailsType {
[XmlArray("PersonPhysicalFeature")]
public List<PhysicalFeatureType> PhysicalFeatures { get; set; }
}
PhysicalFeatureType
class PhysicalFeatureType {
public int CaseSk { get; set; }
public int ParticipantSk { get; set; }
public Participant participant { get; set; }
}
PhysicalFeatureType EF Mapping
class PhysicalFeatureMap : EntityTypeConfiguration<PhysicalFeatureType> {
HasRequired(t => t.Participant)
.WithMany(t => t.PhysicalDetails.PhysicalFeatures)
.HasForeignKey(d => new { d.CaseSk, d.ParticipantSk});
}
答案 0 :(得分:2)
到目前为止,我所提出的只是创建一个隐藏嵌套的代理属性:
<强>参与者强>
class Participant {
public PhysicalDetailsType PhysicalDetails { get; set; }
public List<PhysicalFeatureType> PhysicalFeatures {
get { return PhysicalDetails.PhysicalFeatures; }
set { Physicaldetails.PhysicalFeatures = value; }
}
}
到目前为止似乎正在运作。
答案 1 :(得分:0)
所有映射方法(HasRequired
,WithMany
等)中的表达式必须在方法的泛型类型(lambda)上指定声明的属性变量t
,在您的示例中为Participant
类型。 Participant
没有财产PhysicalDetails.PhysicalFeatures
。所以说,表达式不能包含多个点。
如果我理解正确,您的数据库中只有两个表(适用于Participant
和PhysicalFeatureType
)但三个类 (中间有额外的PhysicalDetailsType
)。 PhysicalDetailsType
是&#34;中间&#34; type,是模型中一对多关系所必需的,但不作为数据库中的表存在,对吧? (只是为了理解,而不是我想知道如何绘制这个或者它是否可能。)