繁体   English   中英

复杂类型的EF6代码优先/ Fluent API抛出错误

[英]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`。 那么为什么将它们放在单独的表中呢?

另一个问题是AssignmentSettingInfoLesson之间的关系。 这是零或一对一吗? 遵循这些指导方针

如果将“ 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
    ...
}

我不知道LineAssignmentSettingInfo之间的关系。 访问:

如果您确实希望AssignmentSettingInfo位于其他表中,则将其配置为一对一方法,如链接中所示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM