我正在努力实现与正在发生的事情in this EF7 fluent API documentation非常相似的事情,但事实并非如此。
我的模型看起来像这样:
public class BlogPost
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public string CreatedBy {get; set; }
public ApplicationUser CreatedByUser { get; set; }
}
我的ApplicationUser类中没有任何与BlogPost相关的内容。所以连接并不需要双向进行。
有人能告诉我如何根据BlogPost中的CreatedBy字段使用Include等于AspNetUsers表中的用户名字段,如何告诉实体框架我想要填充CreatedByUser吗?
以下是我希望能够在我的存储库中执行的操作:
using (var blogContext = new BlogContext())
{
return blogContext .BlogPosts
.Include(bp => bp.CreatedByUser)
}
这是我最好的尝试:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<BlogPost>()
.HasOne(fp => fp.CreatedByUser)
.WithMany()
.HasForeignKey(fp => fp.CreatedBy)
.IsRequired();
}
我觉得这里的诀窍是不向.WithMany()添加参数,因为在我的模型中,我的ApplicationUser模型中没有List属性。
导致我出现问题的主要原因是默认情况下EF正在尝试使用Id字段作为AspNetUsers表中的密钥。我想告诉它使用Username作为密钥,而不是guid。
答案 0 :(得分:0)
我找到了一个完全符合我要求的解决方案。
以下是需要放入DbContext文件的Fluent API代码,以使其正常工作:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Need to do this because if using as a foreign key it must match the length of the principal key
builder.Entity<BlogPost>()
.Property(fp => fp.CreatedBy)
.HasMaxLength(256);
// A BlogPost has one CreatedByUser (notice we must specify the PrincipalKey to be UserName from the AspNetUsers table otherwise EF would attempt to use the Id (Guid) field by default)
builder.Entity<BlogPost>()
.HasOne(bp => bp.CreatedByUser)
.WithMany()
.HasForeignKey(bp => bp.CreatedBy)
.HasPrincipalKey(u => u.UserName)
.IsRequired();
}
然后在我的存储库中,我可以简单地执行以下操作以确保绑定CreatedByUser:
public IEnumerable<BlogPost> GetBlogPosts()
{
return _context.BlogPosts
.Include(bp => bp.CreatedByUser)
.ToList();
}
以下是我的模特的样子:
public class BlogPost
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
// Foreign Key
public string CreatedBy { get; set; }
// Navigation Property
public ApplicationUser CreatedByUser { get; set; }
}
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
由于我的几乎所有对象都有一个CreatedBy字段,我需要获取整个用户才能在我的视图中显示FirstName,LastName,Email等内容我假设我会做很多事情。我可能很少需要通过用户检索我的任何实体的列表,但如果我这样做,我会将List MyObjects添加到ApplicationUser模型,然后在.WithMany(b =&gt; b.MyObjects)参数中指定一些内容
如果有人有任何反馈或其他意见,请告诉我。