EF6 Code First多对多没有收藏

时间:2015-02-04 05:33:54

标签: c# entity-framework code-first

所以我在EF中有以下模型:

public class User: IEntity
{
    public Guid Id { get; protected set; }
    public string Email { get; protected set; }
    internal User()
    {
    }

    public User(Guid id, string email)
    {
        Id = id;
        Email = email;
    }
}

public class Tenant : IEntity
{
    public Guid Id { get; protected set; }
    public string Name { get; protected set; }

    internal Tenant() { }

    public Tenant(Guid id, string name)
    {
        Id = id;
        Name = name;
    }
}

我希望这些实体之间存在多对多的关系,而不会在其中包含集合。

我尝试过创建一个连接实体,如:

public class TenantUser
{
    public int Id { get; set; }
    public virtual Tenant Tenant { get; set; }
    public virtual User User { get; set; }

    internal TenantUser ()
    {
    }

    public TenantUser(Tenant tenant, User user )
    {
        this.Tenant = tenant;
        this.User = user;
    }
}

使用以下设置:

modelBuilder.Entity<TenantUser>()
   .HasRequired<Tenant>(m => m.Tenant)
   .WithMany();

modelBuilder.Entity<TenantUser>()
   .HasRequired<User>(m => m.User)
   .WithMany();

当我保存TenantUser对象时,数据库将填充正确的外键。当我查询所有行的TenantUser DbSet时,它返回所有行,但我只是填充了Id值,Tenant和User都是null。

我尝试将TenantId和UserId字段添加到TenantUser,然后为这些字段执行HasForeignKey,但它没有任何区别; TenantId和UserId在查询时填充,但Tenant和User仍为null。

我觉得我在这里缺少一些简单的东西。任何想法都会很棒:)。

1 个答案:

答案 0 :(得分:5)

如果您想要多对多,请删除配置:

modelBuilder.Entity<TenantUser>()
.HasRequired<Tenant>(m => m.Tenant)
.WithMany();

modelBuilder.Entity<TenantUser>()
.HasRequired<User>(m => m.User)
.WithMany();

为什么呢?因为EF使用协议:

public class User: IEntity
{
    public Guid Id { get; protected set; }
}

public class Tenant : IEntity
{
    public Guid Id { get; protected set; }
}

public class TenantUser
{
    public int Id { get; set; }
    public virtual Tenant Tenant { get; set; }
    public virtual User User { get; set; }
}

这是多对多的流利。

进行查询时,请使用:

public class UnitOfWork : DbContext
{
    public IDbSet<User> Users { get; set; }
    public IDbSet<Tenant> Tenants { get; set; }
    public IDbSet<TenantUser> TenantUsers { get; set; }
}

context.TenantUsers.Include(e => e.Tenant).Include(e => e.User);

然后EF将它们包含在映射中