2016-02-26 118 views
1
public class Customer 
{ 
    public int Id { get; set; } 

    public int AddressId { get; set; } 

    public virtual Address { get; set; } 
} 

public class Address 
{ 
    public int Id { get; set; } 

    public virtual Customer { get; set; } 
} 

客户必须拥有强制地址。地址可能有也可能没有客户。 Address中的Customer导航属性类似于“可空”。我在Customer.AddressId表中有一个唯一的索引。实体框架 - 流利API映射

有什么办法使用流利的API来做这个映射吗?

编辑:

CREATE TABLE Address 
(
    Id   INT NOT NULL IDENTITY PRIMARY KEY, 
    AddressLine1 VARCHAR(50), 
) 

CREATE TABLE Customer 
(
    Id   INT NOT NULL IDENTITY PRIMARY KEY, 
    Name  VARCHAR(50) NOT NULL, 
    AddressId INT NOT NULL, 
    CONSTRAINT FK_Customer_Address FOREIGN KEY(AddressId) REFERENCES Address (Id) 
) 
+0

可能有http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx – daremachine

+0

我尝试了所有的例子,但仍没有得到...我认为没有办法映射此 –

回答

1

我重新整和于数据库的模型,并能记录添加到客户和地址表。

基本上,如果一个客户只能有一个地址,那么这意味着一个地址可以有0个或更多的客户。 (不是0或1)。 但由于您的唯一性限制,地址始终只会以0或1个客户记录结束。但这是一个运行时间约束,EF在设计时不知道这一点。 (我认为它不能完全掌握2路关系的唯一性规则),EF将地址 - 客户建模为0:N,并让运行时处理N永远不会超过1的事实。

这是因为想到了记录。

  1. 一个customerA记录,需要有一个地址a记录
  2. 的AddressB记录可独立插入地址表中。
  3. Customer表中的另一个CustomerC记录需要明确具有Address记录,并且此记录需要AddressB或AddressC。 (由于唯一索引约束,它不能是AddressA)
  4. AddressD记录可以独立插入地址表中。

so AddressA有1个客户记录,AddressD有0个客户记录。

现在的问题是,您的SQL服务器知道客户记录只能有一个地址记录,,并且该地址记录必须是唯一的。

EF无法理解双向意义上的唯一性部分。它知道客户只需要一个地址,但不能强制该地址必须是唯一的。如果您尝试插入已经属于另一个客户的地址的客户,则基础INSERT引发错误时,该错误自然会发生。由于唯一性约束,EF实际上在创建模型方面做得很好,在Customer和Address之间为1:1。

但是因为它不能双向理解唯一性部分,所以它将多个客户映射到单个地址。 (0或更多的客户,而不是0或1)

所以,你的映射需要看起来像这样:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Address>() 
      .HasMany(e => e.Customers) 
      .WithRequired(e => e.Address) 
      .WillCascadeOnDelete(false); 
    } 

这保证,使客户能够始终都需要有一个地址实体和地址有0或更多的客户。 (在实践中,由于唯一性约束,你总是最终只有0或1个客户),但是你不能在EF中执行它。你需要总是获取List<Customers>,它总是会有0或1个元素。

如果您尝试手动修改映射并在Address和Customer(而不是0:N)之间具有可选的0:1关系,那么EF会有点困惑并且由于某种原因开始抛出IDENTITY插入异常。不知道为什么。

,所以你可以用上面的测绘工作,并确信你永远只有0或1的记录,在List<Customers>

已经有功能要求完全理解双方的独特性方面(转化为我认为的良好感知的关系代数)。 https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050579-unique-constraint-i-e-candidate-key-support

+0

{“当IDENTITY_INSERT设置为OFF时,无法在表'地址'中为标识列插入显式值。”} –

+0

我不知道我是否可以清楚地解释场景。客户必须有强制性地址。地址可能有也可能没有客户。地址中的Customer导航属性为“可空”。我在Customer.AddressId表中有一个唯一的索引。 –

+0

你编辑的问题,以改变客户的地址顺序..不知道为什么我的答案是倒退..现在尝试 –

-1
public class Customer 
{ 
    public int Id { get; set; } 
    public Address { get; set; } 
} 
public class Address 
{ 
    public int Id { get; set; } 
    public int? CustomerId { get; set; } 
    public virtual Customer { get; set; } 
} 
+0

这不是所提到的场景。 –