일부 데이터를 반복하고 데이터베이스에 레코드를 만드는 메서드를 작성 중이므로이 메서드는 리포지토리를 사용합니다.dbset.local 또는 데이터베이스에서 데이터를 가져 오는 리포지토리 패턴
가 원래 이런 식으로 뭔가이었다
///Lets assume that there is a string array called arr somewhere above this.
var repo = new ItemRepository();
for (int i = 0; i<1000; i++)
{
if (repo.MyItems.Count(x=>x.ID == arr[i]) == 0)
{
//Doesn't Exist Create
repo.MyItems.Add(new Item(arr[i]));
repo.Save();
}
else
{
//Here I will get an instance of the entity that already exists and do some updates to it
}
}
일을하지만 모든 반복으로 DB에 저장했기 때문에 그것은 아주 천천히, 그래서 제가하고 싶은 것은이 같은으로 변경입니다 :
var repo = new ItemRepository();
for (int i = 0; i<1000; i++)
{
if (repo.MyItems.Count(x=>x.ID == arr[i]) == 0)
{
//Doesn't Exist Create
repo.MyItems.Add(new Item(arr[i]));
}
else
{
//Here I will get an instance of the entity that already exists and do some updates to it
}
}
repo.Save();
따라서 모든 엔티티가 생성 된 후에 만 저장되므로 수천 개가 아닌 하나의 큰 DB 삽입이 완료됩니다.
문제는 항목이 내 데이터베이스에 다시 저장되지 않았기 때문에 repo.MyItems.Count (x => x.ID == i)가 항목을 다시 가져 오지 않았기 때문입니다. dbset.Local 컬렉션
내 질문에 내 로컬 저장소와 데이터베이스를 쿼리 할 수 있도록 내 리포지토리를 수정할 수있는 방법이 있습니다. 키커이거나 데이터베이스에 있거나 이미있을 수 있기 때문입니다. 저장소에 추가되고 데이터베이스에 삽입되지 않음
위 코드는 의사 코드이지만 일종의 표현은 저장소 방법이
와 같은 것입니다.public int count(string val)
{
IQueryable<T> data = _dbSet;
return data.Count(x=>x.COLUMNNAME == val);
}
다시 이것은 내가 repo에서 가지고있는 것의 표현 일 뿐이지 만 내가 무엇을 할 것인지에 대한 약간의 아이디어를 제공해야합니다. 내가 문제를 정확하게 이해 바랍니다
저장소 패턴이 아닙니다. 그것은 DbSet에 대한 쓸모없는 추상화입니다. 사실,이 코드는 저장소 구현이 무엇보다 유사해야합니다. 하지만 유스 케이스에 저장소가 필요하지 않을 수도 있습니다. – MikeSW
그리고 대부분의 건설적인 코멘트에 대한상은 다음과 같습니다 ... :) 이것은 우리가 UI와 BL 레이어를 영속 계층에 알맞게 유지하지 않고 엔터티 프레임 워크와 직접 상호 작용하지 않기 때문에 dbSet의 추상화입니다. 위의 코드는 제가 수행하려고하는 시스템에서 가져온 것이 아니며, 내가하려고하는 것을 전달하기 위해 단순화 된 의사 코드입니다. 리포지토리 패턴의 구현이 어떻게되어야하는지에 대한 의견이 있으실 것입니다. 임포트가 잘못되어 있다면 그것에 대해 알고 싶습니다!:) – D3vy
UI가 알 수도 있지만 BL은 DbSet 또는 EF [DAO 또는 db를 삽입하십시오]와 관련된 모든 것을 알지 못합니다. 귀하의 '저장소'는 가치를 더하지 않으며 누출됩니다. 'repository.Items.Add/Count'가 없습니다. 그냥 'repository.Add (aLotOfBusinessObjects)'가 있어야합니다. 여기서하고있는 일은 추상화 아래 숨겨진 EF를 사용하는 것입니다. 그러나 사고 방식과 코드는 EF입니다. 빠른 테스트 : 당신이 Azure 테이블로 전환하고있는 것처럼 가장해야하는 유일한 변화는 저장소 구현이 아니라 인터페이스가 아니라 저장소를 호출하는 코드입니다. – MikeSW