2016-07-14 76 views
0

我有一個Asp.Net項目與實體框架7我有一個電子郵件類與附件列表。地圖私有財產

我不想離開,任何人添加項目到我的清單,其中我有

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

現在,我想要映射到數據庫屬性的資源,而不是附件的關係。

實體框架7上升例外...

我該如何做到這一點。

+0

你能告訴我們EF拋出什麼異常嗎? – Pedro

+0

另外,您爲什麼要將EF映射完成到'Resources'屬性而不是'Attachments'之一? – Pedro

回答

0

將此區分爲兩種不同的模型,一種是映射到數據庫的內部模型,另一種是用戶可用的模型。 這也是在圖層之間傳遞數據的正確方法。

希望它有幫助!

0

我同意Itay。

也許這個代碼示例可以幫助你。

製作映射到數據庫表的實體。

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