【问题标题】:EF 5 Inheritance Query IssueEF 5 继承查询问题
【发布时间】:2014-01-13 21:48:30
【问题描述】:

我目前遇到的问题是 Entity Framework 5 没有返回当该实体派生自具有我要查询的属性的实体时存在的记录。

这些是我的实体:

public class Person
{
    [Key]
    public int Id { get; set; }

    public string Email { get; set; }
}

public class User : Person
{
    public  DateTime LastLoginDate { get; set; }    
}

我的数据上下文:

public class DataContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Person> Persons { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().Map(m => { m.ToTable("User"); });

        modelBuilder.Entity<Person>()
                    .Property(x => x.Id)
                    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }
}

存储库:

public class UserRepository
{
    private readonly DataContext _dataContext;

    public UserRepository(DataContext dataContext)
    {
        _dataContext = dataContext;
    }

    public User GetByEmailAddress(string emailAddress)
    {
        if (string.IsNullOrEmpty(emailAddress))
            throw new ArgumentException("The emailAddress parameter cannot be null or empty.", "emailAddress");

        //This query works
        var working = _dataContext.Persons
            .FirstOrDefault(x => x.Email.Equals(emailAddress, StringComparison.CurrentCultureIgnoreCase));

        //Where as this returns null
        var query = _dataContext.Users
                .FirstOrDefault(x => x.Email.Equals(emailAddress, StringComparison.CurrentCultureIgnoreCase));

        return query;
    }
}

如果我尝试通过电子邮件地址查询 Person,我会得到我正在寻找的记录;但是,如果我通过电子邮件地址查询 用户,我会得到一个空结果。

任何建议将不胜感激。

【问题讨论】:

    标签: c# sql entity-framework


    【解决方案1】:

    您要找的人是如何添加的?保存时它们是添加到 Persons 集合还是 Users 集合中?他们是用户类型还是个人类型?这两个表(数据库中的用户和人员)的内容是什么。

    我已经复制了上面的代码,但是当我添加测试用户时,我添加了这样的代码:

    _dataContext.Users.Add(new User { Email = emailAddress, LastLoginDate = DateTime.Now });
    _dataContext.SaveChanges();
    

    两个查询都可以正常工作(它们返回那个用户)。

    即使我将它们添加为 User 类型但添加到 Person 集合中,两个查询仍然会返回。唯一不起作用的情况是,如果我将 Person 类型添加到 Person 集合,那么我会得到您在上面概述的结果。

    我建议将 Person 类标记为“抽象”,这样未来的开发人员就不会试图创建该类型的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多