我是一名新手,正在学习使用EntityFramework 6,并在POCO方面遇到了问题。
以下是我的代码:
Domain.cs
public abstract class BaseEntity
{
[Key]
public long Id { get; set; }
}
public class User : BaseEntity
{
public long UserRoleId { get; set; }
public string Name { get; set; }
public virtual _EntityUserRole UserRole { get; set; }
}
public class UserRole : BaseEntity
{
public string Name { get; set; }
public virtual ICollection<_EntityUser> Users { get; set; }
public virtual ICollection<_EntityUserPermission> UserPermissions { get; set; }
internal _EntityUserRole()
{
Users = new List<_EntityUser>();
UserPermissions = new List<_EntityUserPermission>();
}
}
public class UserPermission : BaseEntity
{
public string Name { get; set; }
public virtual ICollection<_EntityUserRole> UserRoles { get; set; }
internal _EntityUserPermission()
{
UserRoles = new List<_EntityUserRole>();
}
}
Mapping.cs
public abstract class BaseEntityMap<T> : EntityTypeConfiguration<T> where T : BaseEntity
{
public BaseEntityMap()
{
ToTable(typeof(T).Name);
HasKey(a => a.Id);
}
}
public class UserMap : BaseEntityMap<User>
{
public UserMap()
: base()
{
HasRequired(x => x.UserRole)
.WithMany(x => x.Users)
.HasForeignKey(x => x.UserRoleId);
}
}
public class UserRoleMap : BaseEntityMap<UserRole>
{
public UserRoleMap()
: base()
{
HasMany(x => x.UserPermissions)
.WithMany(x => x.UserRoles)
.Map(x =>
{
x.MapLeftKey("UserRoleId");
x.MapRightKey("UserPermissionId");
x.ToTable("_EntityUserRole_UserPermission");
});
}
}
public class UserPermissionMap : BaseEntityMap<UserPermission>
{
public UserPermissionMap()
: base()
{
}
}
SqlServerDataContext.cs
internal class SqlServerDataContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<UserRole> UserRoles { get; set; }
public DbSet<UserPermission> UserPermissions { get; set; }
public SqlServerDataContext()
: base("Name=MyDB")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new UserMap());
modelBuilder.Configurations.Add(new UserRoleMap());
modelBuilder.Configurations.Add(new UserPermissionMap());
base.OnModelCreating(modelBuilder);
}
}
Program.cs
private static void Main()
{
using (SqlServerDataContext ctx = new SqlServerDataContext())
{
UserRole role = new UserRole();
role.Name = "Super";
UserPermission prm1 = new UserPermission();
prm1.Name = "Delete";
role.UserPermissions.Add(prm1);
UserPermission prm2 = new UserPermission();
prm2.Name = "Add";
role.UserPermissions.Add(prm2);
UserPermission prm3 = new UserPermission();
prm3.Name = "Edit";
role.UserPermissions.Add(prm3);
User user = new User();
user.Name = "User 1";
user.UserRole = role;
ctx.Users.Add(user);
ctx.SaveChanges();
}
using (SqlServerDataContext ctx = new SqlServerDataContext())
{
var b = ctx.Users.Find(1);
}
}
结果
就像在屏幕上打印一样,在我向User插入记录后,当我检索UserPermissions时为空。请帮忙!谢谢。
Include
!@KelvinGo - Callum LiningtonError 7 'System.Linq.IQueryable<WinForm.User>' does not contain a definition for 'Find' and no extension method 'Find' accepting a first argument of type 'System.Linq.IQueryable<WinForm.User>' could be found (are you missing a using directive or an assembly reference?)
@No1_Melman - Kelvin GoDbSet
具有Find
方法,但当你开始使用Include
时,它会将返回类型更改为IQueryable<T>
。因此,你需要使用FirstOrDefault
查看我的更新 - Callum Linington