注意:正在使用的技术是ASP.Net MVC 3,实体,SQL Server Management Studio
似乎在我运行时,上下文为:public class DatabaseInit : DropCreateDatabaseAlways<LocationAppContext>
它创建数据库,但我的服务分配表有一个额外的外键调用
ServiceAssignment_Service
什么时候不应该。
我的服务分配模型如下:
namespace LocationApp.Models
{
public class ServiceAssignment
{
public int id { get; set; }
public int locationID { get; set; }
public int ServiceID { get; set; }
public virtual Location Location { get; set; }
public virtual ServiceAssignment Service { get; set;}
}
}
,服务模型如下:
namespace LocationApp.Models
{
public class Service
{
public Service()
{
this.ServiceAssignments = new HashSet<ServiceAssignment>();
}
public int id { get; set; }
public string name { get; set; }
public string description { get; set; }
public bool active { get; set; }
public string icon { get; set; }
public virtual ICollection<ServiceAssignment> ServiceAssignments { get; set; }
}
}
据说,关系很简单:
服务分配有许多位置ID和服务ID。
为什么要生成这个额外的foriegn密钥?那些应该存在的关键词:
这些是他们的,这第三个人是多么令人困惑......
第二部分是:如果id 2的位置具有2,3,6,7的服务id,我如何返回所有服务id,以便我可以将对象传递给服务查询以获取所有信息在基于ID的服务上?
上下文类:
namespace LocationApp.DAL
{
public class LocationAppContext : DbContext
{
public DbSet<Content> Contents { get; set; }
public DbSet<Location> Locations { get; set; }
public DbSet<ServiceAssignment> ServiceAssignments { get; set; }
public DbSet<Service> Services { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Location>().HasMany(sa => sa.ServiceAssignments);
modelBuilder.Entity<Service>().HasMany(sa => sa.ServiceAssignments);
}
}
}
答案 0 :(得分:0)
我认为您必须告诉EF Service.ServiceAssignments
是ServiceAssignment.Service
的反向导航属性,而Location.ServiceAssignments
是ServiceAssignment.Location
的反向导航属性。现在使用您的映射,您只需指定Location
或Service
有多个ServiceAssignments
。 EF会将ServiceAssignment
中的导航属性视为单独关系的结束。
尝试改为映射:
modelBuilder.Entity<Location>()
.HasMany(l => l.ServiceAssignments)
.WithRequired(sa => sa.Location)
.HasForeignKey(sa => sa.LocationID);
modelBuilder.Entity<Service>()
.HasMany(s => s.ServiceAssignments)
.WithRequired(sa => sa.Service)
.HasForeignKey(sa => sa.ServiceID);
您可以完全删除此映射作为替代方法,因为EF应按惯例检测正确的关系。
因此,使用无映射(=按惯例映射)或完全映射(=指定两个关系的末尾)。您使用的50%映射可能就是问题所在。