다음 코드를 고려 실제로 삭제하는 대신 삭제됩니다.C#을 추상 클래스 일반적인 특성은
public virtual void Delete(T entity)
{
entity.Deleted = true;
dbset.Attach(entity);
dataContext.Entry(entity).State = EntityState.Modified;
}
나는 POCO 엔티티를 사용하고 있으며 모두 삭제 된 속성이 있습니다. 그러나 위 코드에서 entity는 T 유형이고 T는 표현할 수있는 모든 객체에 Deleted 속성이 있다는 것을 "알지 못합니다." 이것을 해결하는 가장 우아한 방법은 무엇입니까?
그건 그렇고, 내 추상 클래스에서 비슷한 방식으로 다른 필드 (DateCreated, CreatedBy, DateModified 및 ModifiedBy)에 액세스하고 싶습니다.
UPDATE : 나는 인터페이스와 처음에는 좋은 듯 추상 클래스 솔루션을 모두 시도했지만 컴파일 할 때 나는 두 경우 모두 다음과 같은 오류 메시지를 받았습니다 :
에러 11 종류를 ' MyProject.Domain.Person '은 제네릭 형식 또는 메서드'MyProject.Data.Infrastructure.RepositoryBase '에서 형식 매개 변수'T '로 사용할 수 없습니다. 'MyProject.Domain.Person'에서 'MyProject.Domain.AbstractEntity'로의 암시적인 참조 변환은 없습니다.
namespace MyProject.Data { public class PersonRepository : RepositoryBase<Person>, IPersonRepository { public PersonRepository(IDatabaseFactory databaseFactory) : base(databaseFactory) { } } public interface IPersonRepository : IRepository<Person> { } }
업데이트 2 : 나는 마침내 그것을 가지고
가 SLaks에 의해 제안 된 솔루션과 함께 작동하도록 여기
그리고
오류 메시지가 참조하는 코드입니다. 나는 인터페이스를 사용하고, 그들은 모두 다음과 같은 IEntity 인터페이스에서 파생 할 수 있도록 나는 모든 POCO 엔티티를 생성하는 템플릿을 수정 :namespace MyProject.Domain
{
public interface IEntity
{
System.DateTime CreatedDate
{
get;
set;
}
string CreatedBy
{
get;
set;
}
System.DateTime ModifiedDate
{
get;
set;
}
string ModifiedBy
{
get;
set;
}
bool Deleted
{
get;
set;
}
}
}
더 복잡한 것 추상 엔티티 클래스를 사용의 모든 속성이 있기 때문에, 추상 클래스는 엔티티 클래스에서 오버라이드되어야합니다.
이 당신에 대해 요구하는'여기서 T : 클래스, MyClass'? – Tigran
@ Tigran 나는 그것을 시도했지만 컴파일 오류 메시지가 나타납니다. 위의 업데이트를 참조하십시오. –
컴파일러 오류는 Person이 AbstractEntity에서 상속하지 않는다는 것을 의미합니다. 기본 클래스를 재정의하는 것을 잊었습니까? – phoog