Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架使用fluentapi编写第一个复合键_C#_Entity Framework_Composite Key - Fatal编程技术网

C# 实体框架使用fluentapi编写第一个复合键

C# 实体框架使用fluentapi编写第一个复合键,c#,entity-framework,composite-key,C#,Entity Framework,Composite Key,我正在学习实体框架,并决定重新实现我几年前使用ADO.NET编写的知识库应用程序 我有三个实体:Article、UserAccount和Rating Article和UserAccount都是不言自明的。评级是一个包含可能评级的表格:非常好=5,良好=4,平均=3,差=2,非常差=1 查看文章时,我希望显示该文章的平均评分。如果用户已经对该文章进行了评分,则不应允许他们再次对该文章进行评分 我已经成功地使用fluent API在两个实体之间创建了查找表,使用类似于: HasMan

我正在学习实体框架,并决定重新实现我几年前使用ADO.NET编写的知识库应用程序

我有三个实体:Article、UserAccount和Rating

Article和UserAccount都是不言自明的。评级是一个包含可能评级的表格:非常好=5,良好=4,平均=3,差=2,非常差=1

查看文章时,我希望显示该文章的平均评分。如果用户已经对该文章进行了评分,则不应允许他们再次对该文章进行评分

我已经成功地使用fluent API在两个实体之间创建了查找表,使用类似于:

        HasMany(a => a.Tags)
            .WithMany(t => t.Articles)
            .Map(x =>
                {
                    x.ToTable("ArticleTags");
                    x.MapLeftKey("ArticleId");
                    x.MapRightKey("TagId");
                });
我正在努力创建甚至尝试在三个表之间创建查找表:

ArticleUserRatings(ArticleId、UserAccountId、RatingId)

我可以创建一个名为ArticleUserRating的实体

public class ArticleUserRating
{
    public int ArticleId { get; set; }
    public int UserAccountId { get; set; }
    public int RatingId { get; set; }
}
但这对我来说并不舒服,因为这是一种关系类型的实体

有没有一种方法可以定义这种关系而不创建实体


任何指导都将不胜感激。

我真的认为在实体框架中不可能,更不用说先编写代码了。每当我创建这样的连接时,我通常在中间有一个连接表和一个对应于此的实体。一种看待它的方式是“它可以在设计器中完成吗?”我不这么认为,这可能意味着不首先在代码中完成。但有一件事。。。文章和用户之间的关系是什么?在关系评分中,三个键定义了用户对特定文章的评分。文章创建者和文章审批人等之间存在其他关系,但这些关系与我上面的查询无关。谢谢你的反馈。如果每个评级只有一个用户,那么用户和评级之间的比例是1:N,然后只有文章评级才有一个连接点,这不是更好吗。这样你就可以拥有
Article.Ratings.Where(rating=>rating.User==CurrentUser).Any()
来检查以前的评级,但你不需要一个巨大的三向连接?谢谢Dave,采纳了你的建议。我把评级改为枚举,在用户和评级之间有一个连接表。很酷,很高兴我能帮上忙。