2016-07-14 7 views
0

Entity Framework 7과 함께 Asp.Net 프로젝트가 있습니다. 첨부 파일 목록이있는 전자 메일 클래스가 있습니다.지도 전용 속성

나는 그들에게 내가 지금

private List<Attachment> Resources { get; set; } public IEnumerable<Attachment> Attachments { get; set; }

이 나는 ​​데이터베이스에 첨부하는 대신 속성 자원과의 관계를 매핑 할, 누군가가 내 목록에 항목을 추가하는 것이 떠나고 싶어하지 않습니다.

엔티티 프레임 워크 7 예외 발생 ...

어떻게 할 수 있습니까?

+0

EF가 던지는 예외는 무엇입니까? – Pedro

+0

또한 왜 EF 매핑을'Attachments' 속성 대신'Resources' 속성에 수행하기를 원합니까? – Pedro

답변

0

데이터베이스와 사용자가 사용할 수있는 하나의 내부 모델과 두 가지 모델로 구분하십시오. 레이어간에 데이터를 전달하는 올바른 방법이기도합니다.

희망이 있습니다.

0

나는 Itay에 동의합니다.

아마도이 코드 예제가 도움이 될 수 있습니다.

엔티티를 db 테이블에 매핑합니다. 사용자가 사용할 수있는

public class EmailState 
{ 
    public int Id { get; private set; } 

    public List<AttachmentState> Resources { get; set; } 

    public static Email ToEmail(EmailState state) 
    { 
     return new Email(state); 
    } 
} 

public class AttachmentState 
{ 
    public static Attachment ToAttachment(AttachmentState state) 
    { 
     return new Attachment(state); 
    } 

    public Attachment ToAttachment() 
    { 
     return new Attachment(this); 
    } 
} 

만들기 클래스

public class Email 
{ 
    public Email() 
    { 
     this.State = new EmailState(); 
    } 

    internal Email(EmailState state) 
    { 
     this.State = state; 
    } 

    internal EmailState State { get; set; } 

    public int Id { get; private set; } 

    public IEnumerable<Attachment> Attachments() 
    { 
     return this.State.Resources.Select(x => x.ToAttachment()); 
    } 

    public void AddAttachment(Attachment attachment) 
    { 
     this.State.Resources.Add(attachment.State); 
    }  
} 

public class Attachment 
{ 
    public Attachment() 
    { 
     this.State = new AttachmentState(); 
    } 

    internal Attachment(AttachmentState state) 
    { 
     this.State = state; 
    } 

    internal AttachmentState State { get; set; } 
} 

는 DbContext가

public class EmailDbContext : DbContext 
{ 
    public DbSet<EmailState> Emails { get; set; } 
    public DbSet<AttachmentState> Attachments { get; set; } 
} 

만들기 저장소

public interface IEmailRepository 
{ 
    void Add(Email email); 

    Email GetById(int emailId); 
} 

public class EmailRepository : IEmailRepository 
{ 
    private EmailDbContext _context; 

    public EmailRepository(EmailDbContext context) 
    { 
     _context = context; 
    } 

    public void Add(Email email) 
    { 
     _context.Emails.Add(email.State); 
    } 

    public Email GetById(int emailId) 
    { 
     EmailState emailState = _context.Emails.Single(x => x.Id == emailId); 

     return new Email(emailState); 
    } 
} 

처럼 사용하여 정의
using (var context = new EmailDbContext()) 
{ 
    IEmailRepository repository = new EmailRepository(context); 

    var email = new Email(); 

    repository.Add(email); 

    context.SaveChanges(); 

    var emailFoundById = repository.GetById(email.Id); 
}