C# 实体框架虚拟导航属性
我使用EF6开发web应用程序 假设我有以下型号:C# 实体框架虚拟导航属性,c#,entity-framework,database-design,ef-code-first,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;
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);
}
}
公共接口IBaseEntityObject
{
公共int Id{get;set;}
}
公共抽象类BaseEntityObject:IBaseEntityObject
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
}
公用类文件夹:BaseEntityObject
{
公共字符串名称{get;set;}
公共列表字母{get;set;}
}
公共抽象类字母:BaseEntityObject
{
公共字符串标题{get;set;}
公共字符串内容{get;set;}
公用虚拟文件夹{get;set;}
public int FolderId{get;set;}
公共日期时间创建日期{get;set;}
}
公共类支出者:信
{
//..支出者财产
}
公共类收件人:信函
{
//..接收器属性
}
公共类MyDbContext:DbContext
{
公共数据库集文件夹{get;set;}
公共DbSet字母{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
//文件夹信件
modelBuilder.Entity()
.HasRequired(t=>t.Folder)
.有许多(f=>f字母)
.HasForeignKey(t=>t.FolderId)
.WillCascadeOnDelete(真);
}
}
如果我从信件模型中删除虚拟文件夹导航属性,是否有任何损失?我不希望我的客户在要求写信时收到一个文件夹,这似乎是错误的
我只是想知道,如果删除此属性,我是否会失去一些EF性能
谢谢
我不想让我的客户在要求一个文件夹时收到一个文件夹
信似乎错了
您不应将域对象返回给客户端,而应将数据传输对象返回给客户端:
当您使用远程接口(如远程Facade)时
(388),每次打电话都很贵。因此,您需要减少
电话的数量,这意味着您需要转接更多电话
每次通话都要记录数据。一种方法是使用大量参数。
然而,这通常很难编程——事实上,它通常是
像Java这样只返回一个字符的语言是不可能的
价值观
解决方案是创建一个可以保存所有数据的数据传输对象
呼叫的数据。它需要可序列化才能跨越
连接。通常在服务器端使用汇编程序来
在DTO和任何域对象之间传输数据
据我所知,这意味着创建另一个对象来保存我想发送给客户的数据——这意味着我将为客户创建另一个LetterForClient,它只保存例如Title和FolderId?不管怎样,是否有充分的理由保留虚拟文件夹导航属性?如果未使用virtual,EF将无法在调用此属性时在LazyLoading中填充此属性。如果我设置EnableLazyLoading=false?删除此属性会改变任何事情?@S.Peter保留或不保留整个属性取决于您,谁知道呢,但无论如何,您不应该将域对象返回给您的客户端,这只是一条规则,以避免您当前遇到的情况