簡體   English   中英

實體框架虛擬導航屬性

[英]Entity framework virtual navigation property

我使用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);
    }
}

如果我從Letter模型中刪除虛擬文件夾導航屬性,會不會有任何損失? 我不希望我的客戶在要求一封信時收到一個文件夾。

我只是想知道是否通過刪除此屬性會失去一些EF性能。

謝謝。

我不希望我的客戶在要求一封信時收到一個文件夾。

您不應將域對象返回給客戶端,而應將數據傳輸對象返回給客戶端。 檢查Martin Folwer的定義

當您使用遠程接口(例如Remote Facade(388))時,每次調用都非常昂貴。 結果,您需要減少呼叫數量,這意味着您需要在每個呼叫中​​傳輸更多數據。 一種方法是使用大量參數。 但是,這通常很難進行編程-實際上,對於Java這樣的僅返回單個值的語言,這通常是不可能的。

解決方案是創建一個數據傳輸對象,該對象可以保存呼叫的所有數據。 它需要可序列化才能通過連接。 通常,在服務器端使用匯編程序在DTO和任何域對象之間傳輸數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM