2016-02-17 257 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?刪除這個屬性會改變什麼? –