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

时间:2018-02-27 13:04:51

标签: sql-server entity-framework entity-framework-6 ef-code-first

我有两个模型类MovePlanMove。每个PlanMove对象都必须包含Move个对象,换句话说,每个PlanMove都有一个MoveMove是一个独立的类。

我创建了一个Move模型类,如下所示:

 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模型类是一个独立的模型类。

我创建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; }
}

正如您在上面的类中看到的,为了保存一个Move模型(这是一个独立的模型类),我写了这些属性:

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

但实体框架6代码首先在数据库中为PlanMove_Id类创建Move列。我说这个模型是独立的,不需要与另一个模型通信(我的意思是PlanMove模型类)。

T-SQL Move表:

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模型还可以。

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

1 个答案:

答案 0 :(得分:0)

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

  

当两个实体具有多个实体时,将使用InverseProperty属性   一个关系。

     

您可以使用InversePropertyForeignKey属性进行配置   相同实体之间的多重关系。

所以我将我的模型改为:

举:

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