在 Entity Framework 6 代码优先中将一个模型保存在另一个模型中
Save one model in another model in Entity Framework 6 code-first
我有两个型号 classes,Move
和 PlanMove
。每个 PlanMove
对象必须有一个 Move
对象,换句话说每个 PlanMove
有一个 Move
而 Move
是一个独立的 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
我有两个型号 classes,Move
和 PlanMove
。每个 PlanMove
对象必须有一个 Move
对象,换句话说每个 PlanMove
有一个 Move
而 Move
是一个独立的 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
andForeignKey
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