【问题标题】:Entity framework virtual navigation property实体框架虚拟导航属性
【发布时间】:2016-05-29 01:40:30
【问题描述】:

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我不希望我的客户在请求文件夹时收到 字母..似乎错了。

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

    当您使用远程接口时,例如 Remote Facade (388),每次调用它都是昂贵的。因此,您需要减少 呼叫次数,这意味着您需要转移更多 每次调用的数据。一种方法是使用大量参数。 然而,这通常很难编程——事实上,它经常 像 Java 这样只返回一个单一的语言是不可能的 价值。

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

    【讨论】:

    • 据我了解,这意味着创建另一个对象来保存我要发送给客户的数据 - 这意味着我将创建另一个 LetterForClients,它只保存例如 Title 和 FolderId?无论如何,是否有充分的理由保留虚拟文件夹导航属性?
    • 如果不使用virtual,EF将无法在LazyLoading中填充该属性,此时会调用该属性。
    • 如果我设置 EnableLazyLoading = false?删除此属性会改变什么?
    • @S.Peter 关于是否保留整个属性取决于您,谁知道,但无论如何您不应该将域对象返回给您的客户,这只是避免类似情况的规则您目前正在经历
    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多