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

c# entity-framework ef-code-first

309 观看

2回复

763 作者的声誉

我在Assignment使用EntityFramework 6 将复杂类型映射到模型类(称为)时遇到问题。

我有以下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'

为什么会这样,应该如何解决?

作者: Graham 的来源 发布者: 2017 年 9 月 15 日

回应 2


0

3178 作者的声誉

查阅文档(虽然很旧,但仍然适用):

https://msdn.microsoft.com/zh-CN/library/bb738472(v=vs.100).aspx

这说明复杂类型不能包含导航属性。

我猜这与它们没有主键并且它们没有由上下文单独管理有关。如果它们没有PK并且无法通过上下文识别,则它们也不能“关系终止”。

作者: Akos Nagy 发布者: 2017 年 9 月 15 日

0

14454 作者的声誉

您正在尝试使SQL面向对象。您定义的代表数据库表的类应该是POCO:非常简单的类,仅具有get和set属性。

您在字段上做的太多了。如果您必须在一个表类中填写一个字段,请三思。我从未见过一个示例,其中代表数据库表的类需要一个简单的get / set属性以外的任何字段。

如果一个类与另一个类相关,则这是通过外键而不是通过来完成的this

Assignment表示数据库表。该表应该具有使用外键的某些列以及与其他表的关系。类Assignment不应包含不属于表的智能内容。

例如,我看到Assignment有一个名为_dueIntype 的字段AssignmentDueByInfo。局外人可以访问此字段,但对他们而言,此字段不是AssignmentDueByInfo,而是AssignmentSettingInfo

自己决定Assignment应该有哪些列。

是否有理由将的列放在AssignmentSettingInfo其他表中?如果我看一下您的代码,那么AssignmentSettingInfo没有“ Assignment and there can't be anAssignment without anAssignmentSettingSettingInfo ” 就不可能存在。那么为什么将它们放在单独的表中呢?

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

如果将“ Assignment andAssignmentSettingInfo”放在一张表中,您的代码将像

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放在其他表中,请按链接所示将其配置为一对一方法

作者: Harald Coppoolse 发布者: 2017 年 9 月 15 日
32x32