使用实体框架,如何反映多对多关系并为正在创建的新实体添加存在的实体?

jas*_*son 6 c# mapping many-to-many entity-framework

我是Entity Framework的新手,我正在努力解决问题.我创建了一个不太复杂的数据库.大约有7个表,其中3个是映射表,用于关联一个表记录w/other.我在这里使用的例子是这样的:

  • 表用户

    • 用户身份
    • 用户名
  • 表角色

    • 角色ID
    • ROLENAME
  • 表:UserRole

    • 用户身份
    • 角色ID

外键映射到我的数据库中.当我2008年VS里面创建一个新的实体模型,图中似乎有关系是正确的,但对于UserRole的表不创建一个表.用户和角色之间的关系映射为多对多.

我的问题是我可以创建新用户,我可以创建新角色,但我无法弄清楚如何创建具有现有角色的新用户.此外,UserRole表可能未在模型中正确映射.到目前为止,这是我的代码:

ObjectQuery<Role> roles = context.Roles;
Role role = context.Roles.Where(c => c.RoleName == "Subscriber").First();

 User user = new User
 { 
  DisplayName = "TestCreate2",
  Email = "test@test.com",
  Password = "test"
 };            
 context.AttachTo("Roles", role);
 user.Roles.Add(role);            
 context.AddToUsers(user);
 context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

无法更新EntitySet的"UserRoles",因为它具有DefiningQuery,并且元素中不存在支持当前操作的元素.

这是与UserRole表有关的xml:

<EntitySet Name="UserRoles" EntityType="RememberTheJourneyModel.Store.UserRoles" store:Type="Tables" store:Schema="dbo" store:Name="UserRoles">
        <DefiningQuery>SELECT 
  [UserRoles].[Role_id] AS [Role_id], 
  [UserRoles].[User_id] AS [User_id]
  FROM [dbo].[UserRoles] AS [UserRoles]</DefiningQuery>
      </EntitySet>
Run Code Online (Sandbox Code Playgroud)

它只是为了弄清楚如何查询上下文,以便它给了我一个实际的角色实体.我敢肯定,问题是事做的UserRole是如何映射,但是我刚开始在这里起步,并没有任何不知道从哪里可能出了问题.

我真的已经搜索了谷歌和这个网站,但我想我没有想出正确的搜索参数来找到一个问题来帮助我解决这个问题.我发现一个问题,说EF有这个问题,但是如果你是映射表使两个列成为主键,它就会自行解决.我不知道该怎么做.这是在数据库中完成的(使用SQL SERVER 2005 EXPRESS)还是在映射中完成?这是一个个人项目,因此我可以根据需要发布有关代码或xml的更多详细信息.任何和所有帮助将不胜感激.

mar*_*rkt 5

我记得之前遇到过这个问题......我相信我通过在关联表中创建两个列键来修复它.

您可以将这两列作为SQL Server Management Studio表设计器中的主键.只需同时突出显示User_Id和Role_Id,右键单击左侧并选择Primary Key ...这将使得没有记录可以具有User_Id和Role_Id的相同组合..使每个条目都是唯一的.

然后,您可以在Entity Framework设计器中更新您的数据模型..并希望很好.

我相信如果一个表没有定义任何键以确保记录是唯一的,那么EF将无法正确更新记录,因此框架可以防范该情况.

  • 就是这样!我只是不知道如何分配2个主键.突出显示两行都有效.谢谢! (2认同)