我使用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性能。
感谢。
答案 0 :(得分:0)
我不希望我的客户在他们要求时收到一个文件夹 信..看错了。
您不应该将域对象返回给客户端,而是数据传输对象。 Check Martin Folwer's definition:
当您使用远程界面(例如Remote Facade)时 (388),每次打电话都很贵。因此,您需要减少 通话次数,这意味着您需要转移更多 每次通话的数据。一种方法是使用大量参数。 然而,这通常很难编程 - 实际上,它经常是 Java等语言只能返回一个单独的语言 值。
解决方案是创建一个可以容纳所有数据的数据传输对象 通话数据。它需要可序列化才能跨越 连接。通常在服务器端使用汇编程序 在DTO和任何域对象之间传输数据。