[英]EF6 Code First / Fluent API throwing error with Complex Types
我在使用EntityFramework 6将复杂类型映射到模型类(称为Assignment
)时遇到问题。
我有以下工作Assignment
模型类(仅显示相关成员):
public class Assignment
{
private AssignmentDueByInfo _dueIn;
public Assignment() {
_dueIn = new AssignmentDueByInfo(this)
}
public virtual AssignmentSettingInfo DueIn
{
get { return _dueIn; }
protected set { _dueIn = value; }
}
}
其中AssignmentSettingInfo
定义为:
public class AssignmentSettingInfo
{
protected AssignmentSettingInfo(Assignment assignment)
{
Assignment = assignment;
}
protected readonly Assignment Assignment;
public virtual int? LessonId { get; protected set; }
public virtual Lesson Lesson { get; protected set; }
}
在Entity Framework 6中,我具有以下CodeFirst / Fluent API映射,用于将Assignment
类映射到数据库中的表:
Property(t => t.DueIn.LessonId).HasColumnName("DueByLessonId");
HasOptional(x => x.DueIn.Lesson)
.WithMany(x => x.AssignmentsDue)
.HasForeignKey(x => x.DueIn.LessonId)
.WillCascadeOnDelete(true);
映射引发以下错误:
表达式“ x => x.DueIn.Lesson”不是有效的属性表达式。 该表达式应表示一个属性:C#:'t => t.MyProperty'
为什么会这样,应该如何解决?
查阅文档(虽然很旧,但仍然适用):
https://msdn.microsoft.com/zh-CN/library/bb738472(v=vs.100).aspx
这说明复杂类型不能包含导航属性。
我猜这与以下事实有关:它们没有主键,并且没有由上下文单独管理。 如果它们没有PK并且无法通过上下文识别,则它们也不能“关系终止”。
您正在尝试使SQL面向对象。 您定义的代表数据库表的类应该是POCO:相当简单的类,仅具有get和set属性。
您在字段上做的太多了。 如果您必须在一个表类中填写一个字段,请三思。 我从未见过一个示例,其中代表数据库表的类需要一个简单的get / set属性以外的任何字段。
如果一个类涉及到另一个类,这是由外键完成,而不是通过this
。
类Assignment
表示数据库表。 该表应该具有使用外键的某些列以及与其他表的关系。 类Assignment
不应包含不属于表的智能内容。
例如,我看到Assignment
有一个名为_dueIn
的字段,类型为AssignmentDueByInfo
。 局外人可以访问此字段,但是对于他们来说,此字段不是AssignmentDueByInfo
,而是AssignmentSettingInfo
。
自己决定Assignment
应包含哪些列。
是否有理由将AssignmentSettingInfo
的列放在其他表中? 如果我看你的代码不可能有一个AssignmentSettingInfo
没有的收入分配and there can't be an
分配without an
AssignmentSettingInfo`。 那么为什么将它们放在单独的表中呢?
另一个问题是AssignmentSettingInfo
和Lesson
之间的关系。 这是零或一对一吗? 遵循这些指导方针
如果将“ Assignment and
AssignmentSettingInfo”放在一张表中,您的代码将像
class Assignment
{
public int Id {get; set;}
// every assignment has exactly one AssignmentSettingInfo
// use aggregation (in entity framework terms: complextype)
public AssignmentSettingInfo AssignmentSettingInfo {get; set;}
}
[ComplexType]
class AssignmentSettingInfo
{
// Every AssignmentSettingInfo has zero or one Lesson
public virtual Lesson Lesson { get; set; }
}
类别课程{public int ID {get; 组;}
// relation between Line and AssignmentSettingInfo
...
}
我不知道Line
和AssignmentSettingInfo
之间的关系。 访问:
如果您确实希望AssignmentSettingInfo
位于其他表中,则将其配置为一对一方法,如链接中所示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.