在 Entity Framework 6 代码优先中将一个模型保存在另一个模型中

Save one model in another model in Entity Framework 6 code-first

我有两个型号 classes,MovePlanMove。每个 PlanMove 对象必须有一个 Move 对象,换句话说每个 PlanMove 有一个 MoveMove 是一个独立的 class.

我创建了一个 Move 模型 class 如下:

 public class Move : BaseModel
 {
        [Display(Name = "نام حرکت")]
        public string Name { get; set; }
        [Display(Name = "توضیح حرکت")]
        [UIHint("_SummerNote")]
        [AllowHtml]
        public string Description { get; set; }
        [Display(Name = "تصویر")]
        public string ImageUrl { get; set; }
        [Display(Name = "تصویر بندانگشتی")]
        public string ThumbnailImageUrl { get; set; }
        [Display(Name = "فیلم")]
        public string VideoUrl { get; set; }
        [Display(Name = "گروه حرکت")]
        [ForeignKey("MoveGroup")]
        public string MoveGroupId { get; set; }
        public virtual ICollection<MoveGroup> MoveGroup { get; set; }
}

注:Move模型class是独立模型class。

我这样创建 PlanMove

public class PlanMove:BaseModel
{
        [ForeignKey("FitnessPlanDay")]
        public Guid FitnessPlanDayId { get; set; }
        [Display(Name="حرکات جایگزین")]
        public List<Move> AlternativeMove { get; set; }
        [Display(Name="دفعات تکرار حرکت")]
        public byte Count { get; set; }
        [Display(Name="دفعات ست حرکت")]
        public byte Set { get; set; }
        [Display(Name="شماره گروه حرکات سوپر")]
        public byte? SuperNumber { get; set; }
        [Display(Name="تعداد ست مجموع حرکات سوپر")]
        public byte? SuperSet { get; set; }
        [Display(Name="میزان فشار وزنه بر بدن")]
        public WeighPressure WeighPressure { get; set; }
        [ForeignKey("Move")]
        public Guid MoveId { get; set; }
        public virtual Move Move { get; set; }
        public virtual FitnessPlanDay FitnessPlanDay { get; set; }
}

可以看到上面class为了保存一个Move模型(也就是独立模型class),我写了这些属性:

    [ForeignKey("Move")]
    public Guid MoveId { get; set; }
    public virtual Move Move { get; set; } 

but Entity Framework 6 代码首先在数据库中为 Move class 创建一个 PlanMove_Id 列。我说这个模型是独立的,不需要和另一个模型通信(我的意思是PlanMove模型class)。

T-SQL Move table:

CREATE TABLE [dbo].[Moves] 
(
    [Id] UNIQUEIDENTIFIER DEFAULT (newsequentialid()) NOT NULL,
    [Name] NVARCHAR(MAX) NULL,
    [Description] NVARCHAR(MAX) NULL,
    [ImageUrl] NVARCHAR(MAX) NULL,
    [ThumbnailImageUrl] NVARCHAR(MAX) NULL,
    [VideoUrl] NVARCHAR(MAX) NULL,
    [MoveGroupId] NVARCHAR(MAX) NULL,
    [PlanMove_Id] UNIQUEIDENTIFIER NULL,

    CONSTRAINT [PK_dbo.Moves] PRIMARY KEY CLUSTERED ([Id] ASC),

    CONSTRAINT [FK_dbo.Moves_dbo.PlanMoves_PlanMove_Id] 
         FOREIGN KEY ([PlanMove_Id]) REFERENCES [dbo].[PlanMoves]([Id])
);

但是PlanMove型号没问题

肯定是我的某些工作是错误的,如何将独立模型保存到另一个模型?

我找到了解决方案。 对于这种情况,我需要在两个表之间建立 2 个关系。关系是一对多和多对多。

The InverseProperty attribute is used when two entities have more than one relationship.

you can use the InverseProperty and ForeignKey attributes to configure multiple relationships between the same entities.

所以我将模型更改为:

移动:

public class Move : BaseModel
    {
        [Display(Name = "نام حرکت")]
        public string Name { get; set; }
        [Display(Name = "توضیح حرکت")]
        [UIHint("_SummerNote")]
        [AllowHtml]
        public string Description { get; set; }
        [Display(Name = "تصویر")]
        public string ImageUrl { get; set; }
        [Display(Name = "تصویر بندانگشتی")]
        public string ThumbnailImageUrl { get; set; }
        [Display(Name = "فیلم")]
        public string VideoUrl { get; set; }
        [Display(Name = "گروه حرکت")]
        [ForeignKey("MoveGroup")]
        public string MoveGroupId { get; set; }
        public virtual ICollection<MoveGroup> MoveGroup { get; set; }

        [InverseProperty("OrginalMove")]
        public virtual ICollection<PlanMove> Orginal { get; set; }


        [InverseProperty("AlternativePlanMoves")]
        public virtual ICollection<PlanMove> AlternativeMove { get; set; }
    }
}

和 PlanMove:

 public class PlanMove:BaseModel
    {
        [Display(Name="دفعات تکرار حرکت")]
        public byte Count { get; set; }
        [Display(Name="دفعات ست حرکت")]
        public byte Set { get; set; }
        [Display(Name="شماره گروه حرکات سوپر")]
        public byte? SuperNumber { get; set; }
        [Display(Name="تعداد ست مجموع حرکات سوپر")]
        public byte? SuperSet { get; set; }
        [Display(Name="میزان فشار وزنه بر بدن")]
        public WeighPressure WeighPressure { get; set; }


        [Display(Name = "حرکات جایگزین")]
        public virtual ICollection<Move> AlternativePlanMoves { get; set; }

        [ForeignKey("OrginalMove")]
        public Guid? MoveId { get; set; }

        [Display(Name = "حرکت")]
        public virtual Move OrginalMove { get; set; }


        [ForeignKey("FitnessPlanDay")]
        public Guid FitnessPlanDayId { get; set; }
        public virtual FitnessPlanDay FitnessPlanDay { get; set; }

    }

更多信息:MoreInfo