【问题标题】:Entity Framework - Different multiplicity in SSDL and CSDL实体框架 - SSDL 和 CSDL 中的不同多重性
【发布时间】:2009-12-18 07:56:38
【问题描述】:

我正在使用 EF v1。我有以下表格:

CREATE TABLE category ( 
  category_id    int , 
  category_name  varchar(100) not null,
 CONSTRAINT PRIMARY KEY  (category_id)
 )

CREATE TABLE categoryDetails ( 
  detail_id    int, 
  category_desc varchar(100) not null,
  category_id    int  NOT NULL, 
 CONSTRAINT PRIMARY KEY  (detail_id),
 CONSTRAINT FOREIGN KEY (category_id) REFERENCES category(category_id) 
 )

一个'category'可以有0..1个'categoryDe​​tails'。

在从上述数据库生成的 EF 模型中,EF 将 SSDL 和 CSDL 中的关系建模为 *。 使用设计器 CSDL,我可以将关系/关联从 * 更改为 0..1。但是在检查 SSDL 时,它仍然是 *. 在 SSDL 中将其更改为 0..1 时,出现错误:

"Multiplicity is not valid in Role R111 in relationship RL111. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be *."

请告诉如何更改 SSDL ?

在这种情况下(CSDL 中的 0..1 和 SSDL 中的 *)部分类是根据 0..1 关系为代码创建的(即每个类中的单个引用属性,包含另一个类的类型 -不涉及收集)。 在运行代码时,它运行没有错误。 这是否正确(SSDL 和 CSDL 中的多重性不同)?

对于表结构不能改变的情况,有什么办法可以得到0..1关联?

谢谢。

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    今天,除了 PK 列之外,EF 不再考虑唯一性。这意味着如果 FK 也不是 PK,SSDL 中就不能有 0..1,因为就 EF 而言,数据库中没有任何东西“强制”基数约束。

    即EF 不知道唯一性约束,所以它不相信你!

    但是,正如您所发现的,您可以将 CSDL 中的基数缩小到 0..1,即使在 SSDL 中它仍然是 *。

    由于 EF 基于 CSDL 强制执行语义,这应该可以正常工作。

    即此代码(CSDL 中为 0..1,SSDL 中为 *):

    var category = ctx.Category.Include("Details").First(c => c.ID = 1);
    var oldDetails = category.Details;
    category.Details = new CategoryDetails {....};
    ctx.SaveChanges();
    

    将尝试删除oldDetails

    警告: 在 EF 4.0 中有另一种类型的关联(称为 FK associations) 和不同 独立协会(即 3.5支持的类型)你不能 缩小 FK 的基数 CSDL 中的关联。

    希望对你有帮助

    亚历克斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多