Entity Framework에 개체가 있는지 확인하는 가장 좋은 방법은 무엇입니까?
-
05-07-2019 - |
문제
성능 관점에서 데이터베이스에 객체가 존재하는지 확인하는 가장 좋은 방법은 무엇입니까?저는 Entity Framework 1.0(ASP.NET 3.5 SP1)을 사용하고 있습니다.
해결책
다른 팁
성능 관점에서 존재합니다 명령이 적절할 것입니다. 엔티티 프레임 워크에서 SQL을 직접 실행하는 방법은 여기를 참조하십시오. http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-cl-statements-in-entity-framework-4.aspx
새 데이터 레코드에 제공되는 중복 비율이 매우 높고 중복을 확인하기 위해 수천 건의 데이터베이스 호출이 이루어지는 시나리오를 관리해야 했습니다(그래서 CPU가 100%에서 많은 시간을 보냈습니다).결국 나는 마지막 100,000개의 레코드를 메모리에 캐시해두기로 결정했습니다.이렇게 하면 SQL 데이터베이스에 대한 LINQ 쿼리와 비교할 때 매우 빠른 캐시된 레코드에 대한 중복 항목을 확인한 다음 완전히 새로운 레코드를 데이터베이스에 쓸 수 있을 뿐만 아니라 데이터 캐시에도 추가할 수 있습니다. 길이를 관리할 수 있도록 정렬하고 다듬었습니다.)
원시 데이터는 구문 분석해야 하는 많은 개별 레코드가 포함된 CSV 파일이었습니다.각 연속 파일의 기록(5분마다 약 1개의 비율로 발생)이 상당히 중복되어 중복 비율이 높습니다.
즉, 타임스탬프가 지정된 원시 데이터가 거의 순서대로 들어오는 경우 메모리 캐시를 사용하면 레코드 중복 확인에 도움이 될 수 있습니다.
나는 이것이 매우 오래된 실이지만 나 자신과 같은 누군가 가이 솔루션을 필요로하지만 vb.net에서 위의 답변을 사용한 내용은 다음과 같습니다.
Private Function ValidateUniquePayroll(PropertyToCheck As String) As Boolean
// Return true if Username is Unique
Dim rtnValue = False
Dim context = New CPMModel.CPMEntities
If (context.Employees.Any()) Then ' Check if there are "any" records in the Employee table
Dim employee = From c In context.Employees Select c.PayrollNumber ' Select just the PayrollNumber column to work with
For Each item As Object In employee ' Loop through each employee in the Employees entity
If (item = PropertyToCheck) Then ' Check if PayrollNumber in current row matches PropertyToCheck
// Found a match, throw exception and return False
rtnValue = False
Exit For
Else
// No matches, return True (Unique)
rtnValue = True
End If
Next
Else
// The is currently no employees in the person entity so return True (Unqiue)
rtnValue = True
End If
Return rtnValue
End Function
나는 이것에 약간의 문제가있었습니다 - 내 엔티키는 3 개의 속성 (3 개의 열이있는 pk)으로 구성되어 있으며 각 열을 추악하기 때문에 각 열을 확인하고 싶지 않았습니다. 나는 모든 엔티티와 항상 작동하는 솔루션에 대해 생각했습니다.
이것의 또 다른 이유는 매번 업데이트 외환을 포착하는 것을 좋아하지 않기 때문입니다.
주요 속성의 값을 얻으려면 약간의 반사가 필요합니다.
코드는 사용법을 단순화하기 위해 확장으로 구현됩니다.
context.EntityExists<MyEntityType>(item);
보세요 :
public static bool EntityExists<T>(this ObjectContext context, T entity)
where T : EntityObject
{
object value;
var entityKeyValues = new List<KeyValuePair<string, object>>();
var objectSet = context.CreateObjectSet<T>().EntitySet;
foreach (var member in objectSet.ElementType.KeyMembers)
{
var info = entity.GetType().GetProperty(member.Name);
var tempValue = info.GetValue(entity, null);
var pair = new KeyValuePair<string, object>(member.Name, tempValue);
entityKeyValues.Add(pair);
}
var key = new EntityKey(objectSet.EntityContainer.Name + "." + objectSet.Name, entityKeyValues);
if (context.TryGetObjectByKey(key, out value))
{
return value != null;
}
return false;
}
난 그냥 객체가 null인지 확인하면 100% 작동합니다.
try
{
var ID = Convert.ToInt32(Request.Params["ID"]);
var Cert = (from cert in db.TblCompCertUploads where cert.CertID == ID select cert).FirstOrDefault();
if (Cert != null)
{
db.TblCompCertUploads.DeleteObject(Cert);
db.SaveChanges();
ViewBag.Msg = "Deleted Successfully";
}
else
{
ViewBag.Msg = "Not Found !!";
}
}
catch
{
ViewBag.Msg = "Something Went wrong";
}
왜 그렇게하지 않습니까?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}