实体框架虚拟导航属性

时间:2016-02-17 11:19:33

标签: c# entity-framework database-design ef-code-first

我使用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性能。

感谢。

1 个答案:

答案 0 :(得分:0)

  

我不希望我的客户在他们要求时收到一个文件夹   信..看错了。

您不应该将域对象返回给客户端,而是数据传输对象Check Martin Folwer's definition

  

当您使用远程界面(例如Remote Facade)时   (388),每次打电话都很贵。因此,您需要减少   通话次数,这意味着您需要转移更多   每次通话的数据。一种方法是使用大量参数。   然而,这通常很难编程 - 实际上,它经常是   Java等语言只能返回一个单独的语言   值。

     

解决方案是创建一个可以容纳所有数据的数据传输对象   通话数据。它需要可序列化才能跨越   连接。通常在服务器端使用汇编程序   在DTO和任何域对象之间传输数据。