如何使用fluentApi来管理嵌套关系?

时间:2014-04-19 21:54:47

标签: c# sql-server entity-framework map fluent

我有一个用户模型

public class User {
    public Guid IdGuid {get;set;}
    public string Name {get;set;}
    public virtual List<User> Friends {get;set;}
}

我有第二个模特

public class UserFriendship{
    public Guid FriendShipIdGuid {get;set;}
    public Guid UserIdGuid {get;set;}
    public Guid FriendIdGuid {get;set;}
}

我在上下文中有FluentApi代码OnModelcreating

modelBuilder.Entity<User>().HasMany(u => u.Friends).WithMany().Map(c => {
    c.MapLeftKey("UserIdGuid"); 
    c.MapRightKey("FriendIdGuid");
    c.ToTable("UserFriendship");
    });

问题:我已经拥有UserFriendship班级模型。我想创建关于此模型的用户关系。而我正在使用FluentApi。

但在执行FluentApi代码后,FriendShipIdGuid已从UserFriendship表中删除。

我需要为Users创建一对多关系,并将其保存到表UserFriendship并将其已映射到已存在的类模型名称,其中UserFriendship为dbset的哪个元素。 你能帮帮我吗?

总结一下,我已经有UserFriendship课了。此类包含FrientshipGuidId(密钥),UserIdGuidFriendIdGuid。 我需要将User第一类映射到自己。 我想在UserFriendship课上保存这种关系。 我也希望将Userfriendship用作dbset。

我有

public DbSet<UserFriendship> Friendships { get;set; }

在我的背景下。

我正在使用FluentApi ToTable函数来创建一对多关系表。 但是FluentApi代码删除了FriendshipIdGuid字段。

1 个答案:

答案 0 :(得分:0)

这是不可能的。您无法在List<UserFriendship>课程中使用User,因为有时用户是用户而有时用户是朋友,除非您的UserFriendship表中有重复项这样:

Friendship table:          |
----------------------------

User / Friend
-------------
  A  /   B
  B  /   A
-------------

首先更改UserUserFriendship类,如下所示:

class UserFriendship 
{
    public Guid FriendShipIdGuid {get;set;}
    public Guid UserIdGuid {get;set;}
    public Guid FriendIdGuid {get;set;}

    public User User {get;set;}
    public User Friend {get;set;}
}

class User 
{
    public Guid IdGuid {get;set;}
    public string Name {get;set;}

    // Only if you will allow duplicates in UserFriendship
    public virtual List<UserFriendship> Friendships {get;set;}
}

我不记得Fluent API的确切语法/方法,但您会明白这一点:

modelBuilder.Entity<User>()
  .HasKey(u => u.IdGuid)
  .ToTable("User");

modelBuilder.Entity<UserFriendship>()
  .HasKey(uf => uf.FriendShipIdGuid)
  .ToTable("UserFriendship");

modelBuilder.Entity<UserFriendship>()
  .HasRequired(uf => uf.User)
  .WithMany(u => u.Friendships)       // Only if you allow duplicates
  //.WithMany()                         // Otherwise
  .HasForeignKey(uf => uf.UserIdGuid);

modelBuilder.Entity<UserFriendShip>()
   .HasRequired(uf => uf.Friend)
   .WithMany()
   .HasForeignKey(uf => uf.FriendIdGuid);