2016-02-17 202 views
0

我使用EF6开发Web应用程序。实体框架虚拟导航属性

说我有以下型号:

public interface IBaseEntityObject 
{ 
    public int Id {get; set;} 
} 


public abstract class BaseEntityObject : IBaseEntityObject 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id {get; set;} 
} 


public class Folder : BaseEntityObject 
{ 
    public string Name {get; set;} 

    public List<Letter> Letters {get; set;} 
} 


public abstract class Letter : BaseEntityObject 
{ 
    public string Title {get; set;} 

    public string Content {get; set;} 

    public virtual Folder Folder {get; set;} 

    public int FolderId {get; set;} 

    public DateTime CreationDate {get; set;} 
} 

public class OutgoingLetter : Letter 
{ 
    // .. OutgoingLetter properties 
} 

public class ReceviedLetter : Letter 
{ 
    // .. ReceviedLetter properties 
} 

public class MyDbContext : DbContext 
{ 
    public DbSet<Folder> Folders {get; set;} 

    public DbSet<Letter> Letters {get; set;} 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     // Folder <-> Letters  
     modelBuilder.Entity<Letter>() 
     .HasRequired(t => t.Folder) 
     .WithMany(f => f.Letters) 
     .HasForeignKey(t => t.FolderId) 
     .WillCascadeOnDelete(true); 
    } 
} 

是否有任何的损失,如果我从信件模式删除虚拟文件夹导航属性?我不希望我的客户在收到一封信时收到一个文件夹..看起来不对。

我只是想知道如果通过删除这个属性,我会失去一些EF性能。

谢谢。

回答

0

我不想让我的客户收到一个文件夹,当他们要求一个 letter..seems错误。

你不应该域对象返回到客户端,但数据传输对象Check Martin Folwer's definition

当你和一个远程接口的工作,如远程门面 (388),每次调用它是昂贵的。因此,您需要减少呼叫数量,这意味着您需要在每次呼叫时传输更多的 数据。一种方法是使用大量参数。 但是,这对程序来说通常很尴尬 - 实际上,对于只返回单个 值的Java等语言而言,这通常是不可能的。

解决的办法是创建一个数据传输对象,该数据传输对象可以容纳呼叫的所有 数据。它需要可序列化以穿过 连接。在DTO和任何域对象之间,通常在服务器端使用汇编器来传输数据到 。

+0

从我的理解,这意味着创建另一个对象,将持有我想发送到客户端的数据 - 意味着我会创建另一个LetterForClients,它只能举行例如Title和FolderId? 而不管,是否有任何理由保持虚拟文件夹的导航属性? –

+0

如果不使用虚拟,则在调用此属性时,EF将无法在LazyLoading中填充此属性。 – MadOX

+0

如果我设置EnableLazyLoading = false?删除这个属性会改变什么? –