英文:
How to configure Entity Framework Core to map an entity that takes data from two tables with Fluent API?
问题
为了配置Entity Framework Core,我使用Fluent API。我想知道是否有一种方法可以映射一个实体,其中一些属性与一个表相关,而另一些属性与另一个表相关。
这仅用于查询目的,以便在一个实体中获得联接的结果。在我的情况下,我有以下实体:
class Document
{
long Id,
string Name,
long IdUserLastModification,
string UserNameLastModification,
DateTime DateLastModification,
}
在我的数据库中,有两个表:
Document
(IdDocument,Name,IdUserLastModification,DateLastModification)User
(IdUser,Name,Surname,UserName)
在T-SQL中,我会这样做:
select
IdDocument, Name, IdUser, Surname, DateLastModification
from
Documents as d
inner join
User as u on u.IdUser = d.IdUserLastModification
谢谢!
英文:
To configure Entity Framework Core, I use the Fluent API. I would like to know if there is some way to map an entity that has some properties related with a table and another properties with another.
It is just for query purposes, to have in one entity the result of the join. In my case I have this entities:
class Document
{
long Id,
string Name,
long IdUserLastModification,
string UserNameLastModification,
DateTime DateLastModification,
}
In my database I have two tables:
Document
(IdDocument, Name, IdUserLastModification, DateLastModification)User
(IdUser, Name, Surname, UserName)
In T-SQL I would do in like this:
select
IdDocument, Name, IdUser, Surname, DateLastModification
from
Documents as d
inner join
User as u on u.IdUser = d.IdUserLastModification
Thanks so much.
答案1
得分: 1
我不确定你的意思,但你可以在实体类中添加扩展方法和字段,根据用户ID返回经过筛选的文档列表(以下是未经测试的伪代码),并将用户名作为文档实体的一部分包括。
public partial class Documents //假设这是DbSet
{
public List<Document> GetDocumentsLastModified(long UserID)
{
var result = from d in dbContext.Documents
join u in Users on d.IdUserLastModification equals u.IdUser
where u.IdUser == UserID
select new
{
UserName = u.UserName,
Document = d
};
return result.ToList();
}
[NotMapped] // 这会使EF Core生成的SQL忽略此字段,否则它将包括在所有文档查询中
public string UserName { get; set; } //如果包括了导航属性,可以在getter中执行一些逻辑,如其他人所解释的
}
希望这有所帮助。
英文:
I'm not exactly sure what you mean, but you can add an extension method and field to your entity class to return the filtered document list based on a user id (untested pseudo code follows) and include the UserName as part of your document entity.
public partial class Documents //Assuming this is the DbSet
{
public List<Document> GetDocumentsLastModified(long UserID)
{
var result = from d in dbContext.Documents
join User as u on d.IdUserLastModification equals u.IdUser
select u.UserName, d.*
where u.IdUser == UserID;
return result.ToList();
}
[NotMapped] // this keeps the sql generated by EF core to ignore this field otherwise it would include as part of all Document queries
public string UserName {get; set;} //you could do some of the logic in getter if you include the navigation as explained by others
}
答案2
得分: 0
如果您有一个 dbcontext,可以使用类似这样的代码(LINQ Join):
var result = (from ep in dbContext.Documents
join u in dbContext.Documents on ep.IdUserLastModification equals u.IdUser
select new {
UID = u.IdUser,
Name = ep.Name,
. . .
});
如果没有,您始终可以执行像您在问题中所做的那样的 SQL 查询。
英文:
If you have a dbcontext you can use something like this (LINQ Join):
var result = (from ep in dbContext.Documents
join u in dbContext.Documents on ep.IdUserLastModification equals u.IdUser
select new {
UID = u.IdUser,
Name = ep.Name,
. . .
});
If you don't, you can always do an SQL query as you just did in the question.
答案3
得分: 0
以下是翻译好的部分:
你应该使用导航属性来设置你的类。
public class Document
{
public long Id { get; set; }
public string Name { get; set; }
public long IdUserLastModification { get; set; }
public string UserNameLastModification { get; set; }
public DateTime DateLastModification { get; set; }
public virtual User User { get; set; }
}
public class User
{
public long IdUser { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string UserName { get; set; }
public virtual ICollection<Document> Documents { get; } = new HashSet<Document>();
}
然后在你的 `DbContext` 中使用 Fluent API 配置关系:
modelBuilder.Entity<Document>(e =>
{
e.HasKey(d => d.Id);
e.HasOne(d => d.User)
.WithMany(u => u.Documents)
.HasForeignKey(d => d.IdUserLastModification);
});
然后,你可以使用匿名类型或 DTO 类来查询你想要的数据:
var documents = await dbContext.Documents
.Select(d => new
{
d.Id,
d.Name,
d.IdUserLastModification,
d.User.Surname,
d.DateLastModification
})
.ToListAsync();
英文:
You should setup your classes with Navigation properties.
public class Document
{
public long Id{ get; set; }
public string Name{ get; set; }
public long IdUserLastModification{ get; set; }
public string UserNameLastModification{ get; set; }
public DateTime DateLastModification{ get; set; }
public virtual User User { get; set; }
}
public class User
{
public long IdUser { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string UserName { get; set; }
public virtual ICollection<Document> Documents { get; } = new HashSet<Document>();
}
Then configure the relationship in your DbContext
using fluent API:
modelBuilder.Entity<Document>(e =>
{
e.HasKey(d => d.Id);
e.HasOne(d => d.User)
.WithMany(u => u.Documents)
.HasForeignKey(d => d.IdUserLastModification);
});
You can then query the data you want using either an anonymous type or a DTO class:
var documents = await dbContext.Documents
.Select(d => new
{
d.Id,
d.Name,
d.IdUserLastModification,
d.User.Surname,
d.DateLastModification
})
.ToListAsync();
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论