相关疑难解决方法(0)

实体框架:我设置外键,SaveChanges然后访问导航属性,但它不加载相关实体.为什么不?

我将这个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)

lazy-loading ef-code-first entity-framework-5

36
推荐指数
2
解决办法
2万
查看次数

实体框架中多个"包含"的最佳实践是什么?

假设我们在数据模型中有四个实体:Categories,Books,Authors和BookPages.还假设Categories-Books,Books-Authors和Books-BookPages关系是一对多的.

如果从数据库中检索类别实体实例 - 包括"Books","Books.BookPages"和"Books.Authors" - 这将成为一个严重的性能问题.而且,不包括它们将导致"对象引用未设置为对象的实例"异常.

使用多个Include方法调用的最佳做法是什么?

  • 写一个方法GetCategoryById并包含所有项目(性能问题)
  • 写一个方法GetCategoryById并发送一个包含的关系列表(可能,但似乎还不够优雅)
  • 编写方法,如GetCategoryByIdWithBooks,GetCategoryByIdWithBooksAndBooksPages和GetCategoryByIdWithBooksAndAuthors(不实用)

编辑:通过第二个选项我的意思是这样的:

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

14
推荐指数
1
解决办法
6769
查看次数

在EF7中使用什么代替DbSet Create()方法,并建议简单地使用新的T()

generic repositoryef5应用程序中使用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(),将来有什么问题吗?

c# entity-framework entity-framework-core

7
推荐指数
2
解决办法
1852
查看次数

插入后的延迟加载属性

我有一个父对象和子对象.如果我做以下事情

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就好了.

entity-framework

4
推荐指数
1
解决办法
2888
查看次数