实体框架 - SSDL和CSDL中的不同多样性

时间:2009-12-18 07:56:39

标签: entity-framework

我正在使用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) 
 )

'类别'可以有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关联的解决方案是什么?

谢谢。

1 个答案:

答案 0 :(得分:4)

今天,除了PK专栏之外,EF并没有推断出唯一性。这意味着你不能在SSDL中拥有0..1,而FK也不是PK,因为就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中的关联。

希望这有帮助

亚历