【发布时间】:2013-09-06 12:28:41
【问题描述】:
最初,我有一个基本的Client,只包含:
public class Client : Entity
{
[Required]
public string Name { get; set; }
}
我的Users,以及通常的Name 字段等都有一个Client:
public class User : Entity
{
[Required, MinLength(4), Display(Name = "Username")]
public string Username { get; set; }
[Required, MinLength(2), Display(Name = "First Name")]
public string FirstName { get; set; }
[Required, MinLength(2), Display(Name = "Last Name")]
public string LastName { get; set; }
[Required, EmailAddress]
public string Email { get; set; }
...
[Required]
public virtual Client Client { get; set; }
}
我的Get 方法:
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string[] includeProperties = null)
{
IQueryable<TEntity> query = dbSet;
if (includeProperties != null)
query = includeProperties.Aggregate(query, (q, s) => q.Include(s));
query = query.Where(x => !x.Deleted);
if (filter != null)
query = query.Where(filter);
return orderBy != null ? orderBy(query).ToList() : query.ToList();
}
这一切都很好。所以,关于问题:它实际上是我的客户,因为为AccountManager(即User)添加了一个附加属性,它不喜欢我。
public class Client : Entity
{
[Required]
public string Name { get; set; }
[Required]
public CompanyType CompanyType { get; set; }
[Required]
public ClientStatus Status { get; set; }
[SomethingInHere?]
public virtual User AccountManager { get; set; }
public DateTime? AccessFrom { get; set; }
public DateTime? AccessTo { get; set; }
public DateTime? ClosedDate { get; set; }
}
我已将“AccountManager”添加到 INCLUDE_STRING 的 Gets 中,甚至最近尝试使用各种 ForeignKey/Required 数据注释,但无法将其拉出 AccountManager User和它一起。
因此,我认为这是我无法再提取任何Users 的部分原因,如果不是全部原因的话。
简而言之,我对 EF 关系处理的掌握有些有限,而且我今天的谷歌搜索能力似乎还达不到标准。
许多Users 到Client。每个Client 一个User 作为AccountManager。为什么这对我来说这么难?
编辑:四舍五入的答案。
在模型构建器部分中添加:
modelBuilder.Entity<User>()
.HasRequired(x => x.Client)
.WithMany(x => x.Users);
modelBuilder.Entity<Client>()
.HasOptional(x => x.AccountManager);
并更改 Client 以包含用户列表:
public class Client : Entity
{
[Required]
public string Name { get; set; }
[Required]
public CompanyType CompanyType { get; set; }
[Required]
public ClientStatus Status { get; set; }
public virtual IList<User> Users { get; set; }
public virtual User AccountManager { get; set; }
public DateTime? AccessFrom { get; set; }
public DateTime? AccessTo { get; set; }
public DateTime? ClosedDate { get; set; }
}
这让 EF 很高兴能够正确地把它全部拿出来。
【问题讨论】:
-
您在下面的评论中说“这不是使用 Code First”。您是如何将“AccountManager 的附加属性”添加到课程中的?在视觉设计师表面?还是在 EDMX 文件中?
-
@Slauma 啊,抱歉,显然我撒谎了,我们确实首先使用代码,我在考虑我们不使用的代码首先 migration(不适用于这个项目无论如何)
标签: c# linq entity-framework include linq-to-entities