我将这个Entity类与Entity Framework 5 Code First一起使用:
public class Survey
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string SurveyName { get; set; }
[Required]
public int ClientID { get; set; }
[ForeignKey("ClientID")]
public virtual Client Client { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的Controller的Create方法中,我这样做:
Survey entity = new Survey()
{
SurveyName = "Test Name",
ClientID = 4
};
db.Surveys.Add(entity);
db.SaveChanges();
Client c1 = entity.Client; //Why is this null?
Client c2 = db.Clients.Find(entity.ClientID); //But this isn't?
string s2 = c2.ClientName;
string s1 …Run Code Online (Sandbox Code Playgroud) 假设我们在数据模型中有四个实体:Categories,Books,Authors和BookPages.还假设Categories-Books,Books-Authors和Books-BookPages关系是一对多的.
如果从数据库中检索类别实体实例 - 包括"Books","Books.BookPages"和"Books.Authors" - 这将成为一个严重的性能问题.而且,不包括它们将导致"对象引用未设置为对象的实例"异常.
使用多个Include方法调用的最佳做法是什么?
编辑:通过第二个选项我的意思是这样的:
public static Category GetCategoryById(ModelEntities db, int categoryId, params string[] includeFields)
{
var categories = db.Categories;
foreach (string includeField in includeFields)
{
categories = categories.Include(includeField);
}
return categories.SingleOrDefault(i => i.CategoryId == categoryId);
}
Run Code Online (Sandbox Code Playgroud)
在调用时我们需要这样的代码:
Category theCategory1 = CategoryHelper.GetCategoryById(db, 5, "Books");
Category theCategory2 = CategoryHelper.GetCategoryById(db, 5, "Books", "Books.Pages");
Category theCategory3 = CategoryHelper.GetCategoryById(db, 5, "Books", "Books.Authors");
Category theCategory4 = CategoryHelper.GetCategoryById(db, 5, "Books", "Books.Pages", "Books.Authors");
Run Code Online (Sandbox Code Playgroud)
这种方法有任何明显的缺点吗?
c# architecture entity-framework data-access-layer ef-database-first
我generic repository在ef5应用程序中使用pattren .有一种create()方法IDbSet,在ef7 DbSet中不存在.
Create()EF5 中方法的描述如下:
为此集的类型创建实体的新实例.请注意,此实例未添加或附加到集合.如果基础上下文配置为创建代理并且实体类型满足创建代理的要求,则返回的实例将是代理.
代码示例:
public interface IRepository<T> where T : IDisposable {
T Create();
}
public class Repository<T> : IRepository<T> where T : IDisposable {
protected IUnitOfWork uow;
protected IDbSet<T> entity;
public Repository(IUnitOfWork uow) {
this.uow = uow;
this.entity = uow.Set<T>();
}
public T Create() {
return entity.Create();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么 Create();在EF7中删除了方法DbSet(IDbSet在EF核心中也删除了注意事项)
我发现了这个问题:Create()和新的T(),如果我使用新的T(),将来有什么问题吗?
我有一个父对象和子对象.如果我做以下事情
Child c = new Child();
c.ParentID = parentID;
context.Child.Add(c);
context.SaveChanges();
int i = c.Parent.ParentID; // throws an exception b/c Parent is null
Run Code Online (Sandbox Code Playgroud)
这是为什么这样做的?如果我得到一个新的上下文(保存后),我可以看到Parent就好了.