2016-07-14 6 views
0

私はEntity Framework 7のAsp.Netプロジェクトを持っています。添付ファイルのリストを持つ電子メールクラスがあります。マッププライベートプロパティ

私は彼らは私が今

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

を持って、誰もが私のリストに項目を追加することを残したくない、私は、データベースへの添付ファイルの代わりにプロパティのリソースとの関係をマッピングしたいです。

Entity Frameworkの7上昇例外...私はこれを行うことができますどのように

+0

EFが何を投げているのか教えていただけますか? – Pedro

+0

また、なぜあなたは 'Attachments'の代わりに' Resources'プロパティにEFマッピングをしたいのですか? – Pedro

答えて

0

これを2つの異なるモデルに分けます.1つの内部はデータベースにマップされ、もう1つはユーザーが使用できるモデルになります。 これはレイヤ間でデータを渡す正しい方法です。

希望すると助かります!

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