public class Role { public Guid ID{get;set;} public string Name{get;set;} public string Description{get;set;} public ICollection<Menu> Menu { get; set; } } public class Menu { public Guid ID{get;set;} public string Name{get;set;} public string Description{get;set;} public ICollection<Role> Role { get; set; } } public RoleTypeConfiguration() { HasKey<Guid>(c => c.ID); Property(c => c.ID) .IsRequired() .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); Property(c => c.Name) .IsRequired() .HasMaxLength(25); HasMany<Menu>(c=>c.Menu) .WithMany(c=>c.Role) .Map(c=>{ c.MapLeftKey("RoleID"); c.MapRightKey("MenuID"); c.ToTable("Role_Menu"); }); } 添加角色时会在Menu表中新加一条数,这是为什么呢? Role model = new Role() model.Name = "超级管理员"; model.Description = "超级管理员"; Menu mm = new Menu(){ID=new Guid("BF9D5EC9-EE7F-4786-A5E0-9AAB90ADB73D")}; model.Menu = new List<Menu> { mm }; userService.CreateRoles(model);
添加角色时会在Menu表中新加一条数,这是为什么呢?
其实我的问题和http://q.cnblogs.com/q/51646/这个是一样的,但就不知道怎么解决?
试试将
model.Menu = new List<Menu> { mm };
改为
model.Menu = null;
Role role = new Role(); role.ID = Guid.NewGuid(); role.Name = "超级管理员"; using (var context = new KingDbContext()) { role.Menu.Add(context.Menu.Where(c => c.ID == new Guid("BE5A0FD5-1EAE-4A95-AF34-DA4977F985F8")).First()); context.Roles.Add(role); context.SaveChanges(); }
像上面的写法就没问题,等于是说每次添加的时候都要先去菜单表中取出来。这样做很麻烦。
@浪潮之巅: 你要站在EF的角度考虑,你不告诉它,它怎么知道数据库中已经有了对应的Menu。
@dudu: 可能是习惯了Nhibernate,第一次尝试用很不习惯。我不知道别人觉得EF的这个好不好,但我觉得有点麻烦,我看网上有人的自己生成一张中间表,而不用EF的多表关联了。
很显明,你添加了一个Menu进去……
因为你在Role和Menu之间建立了外键关系,所以你在添加Role的时候,同时也添加了相应的Menu,EntityFramework在处理这种关系的时候,就会把对应的Menu也会添加进去。如果不想添加Menu数据,分开添加就好了。