몇 가지 문제점이 있습니다. 내가 EntityFramework 5를 사용계단식 나무 (부모/자식) 데이터 추가/업데이트
CREATE TABLE [EvaluationProcess].[CriteriaHeader](
[CriteriaHeader_No] [uniqueidentifier] NOT NULL,
[CriteriaHeader_Type] [int] NOT NULL,
[CriteriaHeader_Name] [nvarchar](128) NOT NULL,
[CriteriaHeader_Description] [nvarchar](256) NULL,
[CriteriaHeader_MaxScore] [int] NOT NULL,
[CriteriaHeader_MinScore] [int] NOT NULL,
[CriteriaHeader_ScoreStep] [int] NOT NULL,
[CriteriaHeader_IsCountedResult] [bit] NOT NULL,
[CriteriaHeader_IsBlocked] [bit] NOT NULL,
[OwnedOrganisationID] [uniqueidentifier] NULL,
[ModifyUser] [uniqueidentifier] NULL,
[ModifyDate] [datetime] NULL,
[TimeStamp] [timestamp] NULL,
CONSTRAINT [PK_Criteria] PRIMARY KEY CLUSTERED
(
[CriteriaHeader_No] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [EvaluationProcess].[CriteriaHeader] ADD CONSTRAINT [DF_Criteria_Criteria_No] DEFAULT (newsequentialid()) FOR [CriteriaHeader_No]
GO
ALTER TABLE [EvaluationProcess].[CriteriaHeader] ADD CONSTRAINT [DF_Criteria_Criteria_Type] DEFAULT ((0)) FOR [CriteriaHeader_Type]
GO
ALTER TABLE [EvaluationProcess].[CriteriaHeader] ADD CONSTRAINT [DF_Criteria_Criteria_MaxScore_1] DEFAULT ((5)) FOR [CriteriaHeader_MaxScore]
GO
ALTER TABLE [EvaluationProcess].[CriteriaHeader] ADD CONSTRAINT [DF_Criteria_Criteria_MinScore_1] DEFAULT ((0)) FOR [CriteriaHeader_MinScore]
GO
ALTER TABLE [EvaluationProcess].[CriteriaHeader] ADD CONSTRAINT [DF_Criteria_Criteria_ScoreStep_1] DEFAULT ((1)) FOR [CriteriaHeader_ScoreStep]
GO
ALTER TABLE [EvaluationProcess].[CriteriaHeader] ADD CONSTRAINT [DF_Criteria_Criteria_IsCountedResult] DEFAULT ((0)) FOR [CriteriaHeader_IsCountedResult]
GO
ALTER TABLE [EvaluationProcess].[CriteriaHeader] ADD CONSTRAINT [DF_Criteria_Criteria_IsBlocked] DEFAULT ((0)) FOR [CriteriaHeader_IsBlocked]
GO
ALTER TABLE [EvaluationProcess].[CriteriaHeader] ADD CONSTRAINT [DF_Criteria_ModifyDate] DEFAULT (getdate()) FOR [ModifyDate]
GO
CREATE TABLE [EvaluationProcess].[CriteriaLine](
[CriteriaLine_No] [uniqueidentifier] NOT NULL,
[CriteriaLine_ParentID] [uniqueidentifier] NULL,
[CriteriaLine_CriteriaHeaderID] [uniqueidentifier] NULL,
[CriteriaLine_Text] [nvarchar](128) NOT NULL,
[CriteriaLine_Description] [nvarchar](512) NULL,
[OwnedOrganisationID] [uniqueidentifier] NULL,
[ModifyUser] [uniqueidentifier] NULL,
[ModifyDate] [datetime] NULL,
[TimeStamp] [timestamp] NULL,
CONSTRAINT [PK_CriteriaList] PRIMARY KEY CLUSTERED
(
[CriteriaLine_No] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [EvaluationProcess].[CriteriaLine] ADD CONSTRAINT [DF_CriteriaList_CriteriaList_No] DEFAULT (newsequentialid()) FOR [CriteriaLine_No]
GO
ALTER TABLE [EvaluationProcess].[CriteriaLine] ADD CONSTRAINT [DF_CriteriaList_ModifyDate] DEFAULT (getdate()) FOR [ModifyDate]
GO
ALTER TABLE [EvaluationProcess].[CriteriaLine] WITH CHECK ADD CONSTRAINT [FK_CriteriaLine_CriteriaLine] FOREIGN KEY([CriteriaLine_CriteriaHeaderID])
REFERENCES [EvaluationProcess].[CriteriaHeader] ([CriteriaHeader_No])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [EvaluationProcess].[CriteriaLine] CHECK CONSTRAINT [FK_CriteriaLine_CriteriaLine]
GO
ALTER TABLE [EvaluationProcess].[CriteriaLine] WITH CHECK ADD CONSTRAINT [FK_CriteriaLine_CriteriaLine1] FOREIGN KEY([CriteriaLine_ParentID])
REFERENCES [EvaluationProcess].[CriteriaLine] ([CriteriaLine_No])
GO
ALTER TABLE [EvaluationProcess].[CriteriaLine] CHECK CONSTRAINT [FK_CriteriaLine_CriteriaLine1]
GO
이것은 추가/업데이트 기능
public override bool InsertOrUpdate(object[] _BaseEntityClasses, string _RoleName,
System.Nullable<Guid> _LoginUserID,
System.Nullable<System.Guid> _OrganisationID, bool? IsModified = null)
{
using (Evaluation_SystemConection EvaluationDBContext = new Evaluation_SystemConection())
{
try
{
EvaluationDBContext.Configuration.AutoDetectChangesEnabled = false;
IEnumerable<CriteriaHeader> _BaseEntityClassesList = _BaseEntityClasses.Cast<CriteriaHeader>();
foreach (var OneItem in _BaseEntityClassesList)
{
if (OneItem.CriteriaLines != null)
{
foreach (var OneLine in OneItem.CriteriaLines)
{
if (OneLine.CriteriaLine_No == Guid.Empty)
OneLine.CriteriaLine_CriteriaHeaderID = OneItem.CriteriaHeader_No;
EvaluationDBContext.CriteriaLines.Attach(OneLine);
EvaluationDBContext.Entry(OneLine).State = OneLine.CriteriaLine_No == Guid.Empty ? EntityState.Added : EntityState.Modified;
}
}
EvaluationDBContext.CriteriaHeaders.Add(OneItem);
EvaluationDBContext.Entry(OneItem).State = OneItem.CriteriaHeader_No == Guid.Empty ? EntityState.Added : EntityState.Modified;
if (EvaluationDBContext.SaveChanges() <= 0)
return false;
}
return true;
}
catch (Exception Ex)
{
ErrorMessage.Add("");
ErrorMessage.Add((Ex.InnerException != null) ? Ex.InnerException.Message : Ex.Message);
return false;
}
finally
{
EvaluationDBContext.Configuration.AutoDetectChangesEnabled = true;
}
}
}
그리고 생성 POCO 클래스
데이터 삽입하지 않았다
public partial class CriteriaHeader
{
public CriteriaHeader()
{
this.CriteriaLines = new HashSet<CriteriaLine>();
}
public System.Guid CriteriaHeader_No { get; set; }
public int CriteriaHeader_Type { get; set; }
public string CriteriaHeader_Name { get; set; }
public string CriteriaHeader_Description { get; set; }
public int CriteriaHeader_MaxScore { get; set; }
public int CriteriaHeader_MinScore { get; set; }
public int CriteriaHeader_ScoreStep { get; set; }
public bool CriteriaHeader_IsCountedResult { get; set; }
public bool CriteriaHeader_IsBlocked { get; set; }
public Nullable<System.Guid> OwnedOrganisationID { get; set; }
public Nullable<System.Guid> ModifyUser { get; set; }
public Nullable<System.DateTime> ModifyDate { get; set; }
public byte[] TimeStamp { get; set; }
public virtual ICollection<CriteriaLine> CriteriaLines { get; set; }
}
public partial class CriteriaLine
{
public CriteriaLine()
{
this.CriteriaLine1 = new HashSet<CriteriaLine>();
}
public System.Guid CriteriaLine_No { get; set; }
public Nullable<System.Guid> CriteriaLine_ParentID { get; set; }
public Nullable<System.Guid> CriteriaLine_CriteriaHeaderID { get; set; }
public string CriteriaLine_Text { get; set; }
public string CriteriaLine_Description { get; set; }
public Nullable<System.Guid> OwnedOrganisationID { get; set; }
public Nullable<System.Guid> ModifyUser { get; set; }
public Nullable<System.DateTime> ModifyDate { get; set; }
public byte[] TimeStamp { get; set; }
public virtual CriteriaHeader CriteriaHeader { get; set; }
public virtual ICollection<CriteriaLine> CriteriaLine1 { get; set; }
public virtual CriteriaLine CriteriaLine2 { get; set; }
}
또는 업데이트는이 데이터베이스 구조
CriteriaList
에서 1 단계 이상.
내가 뭘 잘못 했니?
감사의 답변 AutoDetectChangesEnabled = false. 성능 향상을 위해 사용합니다. 사실입니까? – PaataPP
물론, 변경 추적기의 사용량이 적기 때문에 성능이 약간 향상되지만 잘 알고 있어야하는 부작용이 있습니다. 성능이 허용 가능하지 않고 성능을 향상시킬 수있는 다른 방법이없는 경우에만 사용하십시오. –