MVC EF数据库优先与SQL多对多关系

MVC EF数据库优先与SQL多对多关系,sql,asp.net-mvc,entity-framework,database-design,Sql,Asp.net Mvc,Entity Framework,Database Design,资料来源: 我希望能够将数据读/写到使用以下结构的表中: DictionaryTable: DictID int RUWordID int -> FK to RUWordsTable.RUWordID ENWordID int -> FK to ENWordsTable.ENWordID RUWordTable: RUWordID int Word string ENWordTable: ENWordID int Word

资料来源:

我希望能够将数据读/写到使用以下结构的表中:

DictionaryTable:

DictID     int
RUWordID   int   -> FK to RUWordsTable.RUWordID
ENWordID   int   -> FK to ENWordsTable.ENWordID

RUWordTable:

RUWordID   int
Word       string

ENWordTable:

ENWordID   int
Word       string
从MVC视图访问数据的速度和方便性来看,什么是做我想做的事情的最佳选择。据我所知,有创建和使用SQL视图的选项(但不确定是否可能插入数据)。或者在VisualStudioDesigner中使用实体框架创建相同的实体。
基本上,一个字可以进行不同的转换(在另一个表中有几个条目)。我的目标是找到一种方法,通过自动插入将单词添加到字典中(当找不到源代码或翻译时,将其添加到参考表中,如果找到了-只使用现有条目)

这在很大程度上取决于您需要一次性读取的数据量。如果您想查找一个或几个单词的翻译,实体框架模型会做得很好。如果需要获取大量数据,视图或存储过程会更好。但我不认为后者会发生。在MVC视图中,您可能会使用分页

至于插入数据,EF将是一个可行的选择。您已经定义了一个连接表(
DictionaryTable
)。您可以以连接表透明的方式设置EF:

RUWord   ENWord
Привет   Hello
...
class-RuWord
{
公共int Id{get;set;}
公共字符串字{get;set;}
公共ICollection EnWords{get;set;}
}
类单词
{
公共int Id{get;set;}
公共字符串字{get;set;}
公共ICollection RuWords{get;set;}
}
(假设您先编写代码)

在数据输入中,您可以向上下文的
RussianWords
DbSet中添加一个新的俄语单词,并向单词的
EnWords
集合中添加新的或现有的英语单词,然后调用
SaveChanges()
。EF将在连接表中插入单词和适当的记录(将两个外键作为其复合主键)

但是。。。在现实生活中,我几乎看不到纯粹的连接表。我之所以提出这一点,是因为在你的情况下,我很难想象仅仅注册俄语和英语单词之间的关联就足够了。你(至少)不需要某种程度的偏好吗?就像“日期”这个词有更多的翻译,但首选的是日历(除非你在约会网站工作,但即使是这样…)。无论如何,如果要记录有关关联的某些内容,则需要显式映射连接表,并在代码中创建关联记录

我希望这能提供一些指导


编辑(在您的评论之后)


如果使用显式连接实体(即与连接表相对应的类)。该实体可以有两个属性
EnWord
RuWord
,作为上述两个表的参考。数据输入意味着创建一个新的
DictionaryTable
实例并设置其属性(可以是新的或现有的单词)。

谢谢Arnold,我会处理这个问题。但另一个问题是,我正在使用数据库优先的方法,并试图找出如何在VisualStudioDesigner中将一个实体映射到两个表(当我打开edmx文件时)。主要目标是使用数据库上下文创建对数据库的读/写访问权限,如_db.MyCustomEntity.RuWord(这应该是第一列)和_db.MyCustomEntity.EnWord(这应该是第二列)嗨,请参阅我的编辑。edmx是否已经包含DictionaryTable实体?不,它不是。它是数据库中的纯连接表。因此,EF desn不会为此类表创建实体。我在RuWords和EnWords表之间只有多对多关系。但我的想法正好相反——在Visual Studio EF designer中只有一个实体,并且应该是我上面提到的结构。如果EF不知道,它就不能在数据库中设置引用。如果需要一个实体,它只能是数据库中的一个表(实体拆分在这里没有帮助)。但这将是一个次优的解决方案,因为它不是标准化的。你必须用更多的意思重复每个单词,而不是仅仅重复引用。
class RuWord
{
    public int Id { get; set; }
    public string Word { get; set; }
    public ICollection<EnWord> EnWords { get; set; }
}

class EnWord
{
    public int Id { get; set; }
    public string Word { get; set; }
    public ICollection<RuWord> RuWords { get; set; }
}