实体框架关系问题

时间:2016-12-20 23:10:10

标签: c# entity-framework foreign-keys mapping relationship

Hello实体专家,

我已经使用EF工作了一段时间,并且我首先采用了代码优先的方法,它可以让你掌握更多信息。 现在我一直在研究一个不太大的项目,但我遇到了一些障碍(遗传问题就是其中之一)。现在我尝试了几种方法(注释,Fluent Api) 但是我的问题只是给出了另一个错误/异常消息,所以这就是为什么我要问你的建议/帮助。

我有以下实体:

YogaClass

public class YogaClass
    {
      [Key]
      public int YogaClassID { get; set; }
      public virtual List<YogaClassSubscription> YogaClassSubscribtions {get; set;}
}

车间

public class Workshop
    {
        [Key]
       public int WorkShopID { get; set; }
       public virtual List<WorkshopSubscription> WorkshopSubscribtions { get; set;}
}

YogaClassSubscription

public class YogaClassSubscription
    {
        [Key]
        public int YogaClassSubscriptionID { get; set; }

        [Required]
        public virtual Account Account { get; set; }

        //[ForeignKey("Account")]
        //public int AccountID { get; set; }

        [Required]
        public virtual YogaClass YogaClass { get; set; }
}

WorkshopSubscription

 public class WorkshopSubscription
    {
        [Key]
        public int WorkshopSubscriptionID { get; set; }

        [Required]
        public virtual Account Account { get; set; }

        //[ForeignKey("Account")]
        //public int AccountID { get; set; }

        [Required]
        public virtual Workshop Workshop { get; set; }
}

帐户

public class Account
    {
    [Key]
    public int AccountID { get; set; }
    public virtual List<YogaClassSubscription> YogaClassSubscriptions { get; set; }
    public virtual List<WorkshopSubscription> WorkshopSubscriptions { get; set; }

}

哪里: YogaClassSubscription有一个必需的YogaClass&amp;一个必需的帐户 WorkshopSubscription有一个必要的研讨会&amp;一个必需的帐户 帐户有一个List&amp;名单 这不是必需的。

当我播种时,我创建以下实体: Account1,Workshop1,YogaClass1, YogaClassSubscription1(有YogaClass1&amp; Account1)&amp;  WorkshopSubscription1(有Workshop1&amp; Account1)

播种按预期进行,但在第一次寻址数据库时,它无法自行创建数据库。

似乎EF无法正确映射数据库,我尝试在YogaClassSubscription&amp ;;中设置属性int AccountID。 WorkshopSubscription类将其称为外键(注释和流畅的Api),但问题仍然存在。

Fluent API

modelBuilder.Entity<YogaClassSubscription>()
.HasRequired<Account>(ycs => ycs.Account)    
.WithMany(ycs => ycs.YogaClassSubscriptions)
.HasForeignKey(ycs => ycs.AccountID); 

我已尝试为帐户(在播种机中)提供临时ID,以便EF可以在我所指的帐户的2个实例之间产生差异,但这仍然不起作用(这为其他人解决了)

我有点失落,我明白了

1)在两个订阅中,EF无法区分使用帐户所需注释的关联的开头和结尾(由于帐户不需要订阅,因此应该有效)但任何订阅都应该有一个帐户。)

2)有2个实例具有相同的FK(来自帐户),这是正常的,但由于尚未插入(没有ID),因此无法做出明显的改变。

当我不使用任何注释或流畅的Api将属性保留为虚拟时,它会创建数据库,但是应该引用accountID的表为空。

所以我不知道如何为EF正确映射它。 我已经尝试了很多从stackoverflow提出的关于我得到的错误的答案,但没有一个解决了我的问题。

提前感谢您提出任何建议或帮助! 亲切的问候

1 个答案:

答案 0 :(得分:0)

好的,所以我觉得很尴尬,经过一夜的睡眠,我开始思考并且很好,我首先有一个基类订阅哪个WorkshopSubscription&amp; YogaClassSubscription继承自。

在遇到几个问题后,我决定退出基类订阅,并在没有它的情况下继续。当然愚蠢我仍然有那些没有设置帐户的ctors,因为他们在基类中设置所以是的,你去,在ctor添加实体修复了我的问题。谢谢Kim Hoang的时间和建议!

亲切的问候