【问题标题】:My Model creates an extra key for the database why?我的模型为数据库创建了一个额外的密钥,为什么?
【发布时间】:2013-04-12 19:42:41
【问题描述】:

注意:使用的技术是 ASP.Net MVC 3、Entity、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。

为什么会生成这个额外的外键?当前密钥,应该有:

  • PK:桌子的主PK
  • FK 1:Location_ServiceAssignment
  • FK 2:Service_ServiceAssignment

那些都是他们的,这第三个怎么这么莫名其妙......

第二部分是:如果 id 2 的位置的服务 id 为 2,3,6,7 我如何获取所有返回的服务 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);
        }
    }
}

【问题讨论】:

  • 您的服务和位置之间的关系是多对多的?
  • 我记得我遇到过这样的问题,问题是我写错了映射,当多对多或一对多没有正确映射,或者确切的外键没有正确映射时会发生这种情况写给我们看你为这些类写的映射。
  • @Shyju 位置可以有很多服务,因为一个服务可以有很多位置。另请参阅映射的更新 OP。
  • 如果您是 EF 新手,我建议您先通过 SQL 服务器管理工​​具创建数据库,然后通过此免费工具生成类和映射:“Entity Framework Power Tools”,以看看它是如何正确完成的。只需安装它,点击你的项目,你会看到一个新的选项实体框架,它连接到数据库并生成类和映射以及你需要的一切。:visualstudiogallery.msdn.microsoft.com/…
  • @TheWebs:你为什么有ServiceAssignments 。那只是为了在表之间建立多对多关系吗?

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


【解决方案1】:

我认为你必须告诉 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% 映射可能是问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2021-06-24
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多