2017-10-04 8 views
0

이 같은 클래스 뭔가가 :얻기 속성 값

public class foo{ 

     public string FooProp1 {get; set;} 

     public Bar Bar{get; set;} 

    } 

public class Bar{ 

     public string BarProp1 {get; set;} 

     public string BarProp2 {get; set;} 

    } 

내가 만약 내가 업데이트 푸 그때 나는 모든에 대해 해당 속성 이름과 값을 얻을 수있는 몇 가지 감사 설정을 가지고이 속성 '바'떨어져. 'BarProp1'의 속성 이름과 값을 가져올 수있는 방법이 있습니까?

private void ProcessModifiedEntries(Guid transactionId) { 
    foreach (DbEntityEntry entry in ChangeTracker.Entries().Where(t => t.State == EntityState.Modified).ToList()) { 
     Track audit = CreateAudit(entry, transactionId, "U"); 

     foreach (var propertyName in entry.CurrentValues.PropertyNames) { 

       string newValue = entry.CurrentValues[propertyName]?.ToString(); 
       string originalValue = entry.OriginalValues[propertyName]?.ToString();     
       SetAuditProperty(entry, propertyName, originalValue, audit, newValue);    
     } 
    } 
    } 

Foo가 변경되면 BarProp1을 감사하고 싶습니다.

+0

'BarProp1'이 수정 된 경우'Bar'도 또한 'Modified'이기 때문에 이미보고 될 것입니다. –

+0

바가 수정되지 않았습니다. 오직 foo 속성이 수정되었습니다. 그러나 다른 목적을 위해 Audit Bar 속성 값으로 바 속성 값을 가져 오려고합니다. –

+0

그런 다음 감사를위한 추가 정보가 들어있는 (매핑되지 않은) 계산 된 속성을 지정하는 인터페이스를 정의합니다. –

답변

0

클래스가 추가 정보를 감사 시스템에보고하도록합니다. 최선의 방법은 귀하의 CreateAudit 방법에 있다고 생각합니다. 문제는 방법입니다. 물론

var foo = entry.Entity as Foo; 
if (foo != null) 
{ 
    // do something with foo.Bar 
} 

var boo = entry.Entity as Boo; 
if (boo != null) 
{ 
    // do something with boo.Far 
} 

아주 예쁜되지 않습니다 : 수

당신 각 들어오는 entry 특별한 무언가를 거기에 코드가 있습니다.

당신은 내가 이러한 클래스의 각 인터페이스를 정의하고 그 압정 것 감사에 대한 추가 정보를보고해야하는 여러 클래스가있는 경우 : CreateAudit에 다음

public interface IAuditable 
{ 
    string AuditInfo { get; } 
} 

public class Foo : IAuditable 
{ 
    public string FooProp1 { get; set; } 
    public Bar Bar { get; set; } 

    [NotMapped] 
    public string AuditInfo 
    { 
     get { return Bar?.BarProp1; } 
    } 
} 

그리고 :

var auditable = entry.Entity as IAuditable; 
if (auditable != null) 
{ 
    // do something with auditable.AuditInfo 
} 

그리고 비록이 행동을 필요로하는 단 하나의 클래스가 있다고하더라도, 코드를 자명하게하기 때문에 인터페이스를 계속 사용합니다.