2016-07-14 2 views
0

У меня есть проект Asp.Net с Entity Framework 7, и у меня есть класс Email со списком вложений.Карта Частная собственность

Я не хочу, чтобы оставить что-нибудь добавить элемент в список, они у меня есть

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

Теперь я хочу, чтобы отобразить в базу данных отношений с имущественными ресурсами вместо вложений.

Entity Framework 7 расти исключение, ...

Как я могу это сделать.

+0

Можете ли вы рассказать нам, какое исключение выбрасывает EF? – Pedro

+0

Кроме того, почему вы хотите, чтобы сопоставление EF выполнялось с использованием свойства 'Resources' вместо' Attachments'? – 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); 
    } 
} 

Make-классы, которые доступны для пользователей

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

хранилище Make

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