【问题标题】:Mapping table without clustered primary key没有聚集主键的映射表
【发布时间】:2013-01-21 22:41:57
【问题描述】:

当我的DataContext 中有两个 POCO 类(我将它们用作DbSet<>)时,EF 代码首先在幕后创建一个映射表:

class Subscription
{
   ICollection<Product> Products {get;set}
}

class Product
{
   ICollection<Subscription> Subscriptions {get;set}
}

和秘密映射表:

CREATE TABLE [dbo].[ProductSubscriptions](
  [Product_Id] [bigint] NOT NULL,
  [Subscription_Id] [bigint] NOT NULL
) ON [PRIMARY]

在两个 ID 字段上有一个聚集的主键。

问题: 是否可以在两个字段上都没有聚集主键的情况下创建表?因为我在这里和那里有多个条目,例如:

{ Product_Id = 1, Subscription_Id = 1 }
{ Product_Id = 1, Subscription_Id = 1 }
{ Product_Id = 1, Subscription_Id = 2 }
{ Product_Id = 1, Subscription_Id = 2 }
...

我删除了主键,但是对DataContext.Products.Subscriptions.Add(1) 的多次调用只添加了一个项目,而不是它被调用的次数。

【问题讨论】:

  • 为什么 ProductSubscriptions 表中有重复项?它们是什么意思?

标签: c# sql linq entity-framework-4 ef-code-first


【解决方案1】:

我认为您将必须明确拥有一个明确执行映射的实体。关系本身将有一个 ID,因为它是主键而不是复合键。它假设(我认为是正确的)您的意图不是拥有多个关系实例。否则它怎么知道如果你需要编辑或删除哪一个?

另外,为什么你有多个关系实例?一个真的与另一个不同吗?或者,如果订阅有多个单一产品,您是否只需要添加“计数”?

看来你需要这样的东西:

class Subscription
{
   ICollection<SubscriptionDetail> SubscriptionDetails {get;set}
}

class SubscriptionDetail
{
    Product Product {get; set;}
    int count {get; set;} // have a count vs. having multiple Product entries?
}

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2011-05-07
    • 2013-03-26
    • 2017-06-28
    相关资源
    最近更新 更多