2016-07-14 17 views
0

Ich habe ein Asp.Net-Projekt mit Entity Framework 7 und ich habe eine Email-Klasse mit einer Liste von Anhängen.Map Private Property

Ich will nicht verlassen, dass jemand einen Artikel zu meiner Liste hinzufügen, sie ich habe

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

Jetzt will ich mit den Eigenschafts Ressourcen stattdessen Attachments, die Beziehung zu Datenbank abzubilden.

Entity Framework 7 eine Ausnahme steigen ...

Wie kann ich das tun.

+0

Können Sie uns sagen, welche Ausnahme EF wirft? – Pedro

+0

Warum soll das EF-Mapping auch an die 'Resources'-Eigenschaft anstatt an die 'Attachments'-Eigenschaft erfolgen? – Pedro

Antwort

0

Trennen Sie das auf zwei verschiedene Modelle, ein internes, das der Datenbank zugeordnet wird, und ein anderes, das den Benutzern zur Verfügung steht. Es ist auch die richtige Art, Daten zwischen Layern zu übertragen.

Hoffe es hilft!

0

Ich stimme Itay zu.

Vielleicht könnte Ihnen dieses Codebeispiel helfen.

Stellen Sie Entitäten her, die DB-Tabellen zugeordnet sind.

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); 
    } 
} 

Klassen machen, dass

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; } 
} 

für Benutzer verfügbar sind definieren DbContext

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

Make-Repository

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); 
    } 
} 

Verwenden Sie es wie dieses

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); 
}