EF6 Code First 多对多无集合
EF6 Code First many-to-many without collections
所以我在 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 时,它 returns 所有行,但我只得到填充的 Id 值,Tenant 和 User 都是空的。
我尝试将 TenantId 和 UserId 字段添加到 TenantUser,然后为这些字段执行 HasForeignKey,但没有任何区别;查询时填充了 TenantId 和 UserId,但 Tenant 和 User 仍然为空。
我觉得我在这里缺少一些简单的东西。任何想法都会很棒:)
如果你想要多对多,那么去掉配置:
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 将它们包含在映射中
所以我在 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 时,它 returns 所有行,但我只得到填充的 Id 值,Tenant 和 User 都是空的。
我尝试将 TenantId 和 UserId 字段添加到 TenantUser,然后为这些字段执行 HasForeignKey,但没有任何区别;查询时填充了 TenantId 和 UserId,但 Tenant 和 User 仍然为空。
我觉得我在这里缺少一些简单的东西。任何想法都会很棒:)
如果你想要多对多,那么去掉配置:
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 将它们包含在映射中