我的模型为数据库创建了一个额外的密钥原因?

时间:2013-04-12 19:42:41

标签: asp.net-mvc-3 entity-framework

注意:正在使用的技术是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密钥?那些应该存在的关键词:

  • PK :表格的主要PK
  • FK 1 :Location_ServiceAssignment
  • FK 2 :Service_ServiceAssignment

这些是他们的,这第三个人是多么令人困惑......

第二部分是:如果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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我认为您必须告诉EF Service.ServiceAssignmentsServiceAssignment.Service的反向导航属性,而Location.ServiceAssignmentsServiceAssignment.Location的反向导航属性。现在使用您的映射,您只需指定LocationService有多个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%映射可能就是问题所在。