3

我正在使用 Entity Framework 4.3 Code-FIrst 创建一个新的数据库模型;使用流畅的 API。虚拟模型如下。

所以我的主要对象是Something,我需要跟踪它。所有其他项目都是补充。通常在数据库中,我会分配一个表,例如联系人、一个主键和一个用于关系的外键。但是,阅读有关 Fluent API 和复杂类型的更多信息,尤其是这篇文章,我注意到(我认为)我可以让 EF 负责链接这些对象/表,我不必担心它们作为存储库我的 MVC 应用程序。

所以请注意:

  • 与联系人有一对多的关系
  • 联系人与地址有一对多
  • 联系人与 PhoenNumber 一对多

知道了这一点,我的困惑在于复杂类型,因为 Contact 是 Somethign 的 Complext 类型,而 Address 和 PhoneNumber 是 Somethign 的复杂类型。

  • 我将如何在 Fluent API 中设置这种关系?
  • 我怎么说地址是必需的?
  • 在 ASP.NET MVC 中使用域驱动开发,我是否必须维护 IContactRepository 和 IAddressRepository 的存储库才能推送到控制器?

(请注意,为简洁起见,省略了一些代码。)

// attempt
void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.ComplexType<Contact>();

    modelBuilder.ComplexType<Contact>().Property(p => p.Address).IsRequired();  // COMPILER ERROR

    modelBuilder.ComplexType<Address>();
    modelBuilder.ComplexType<PhoneNumber>();    
}


// DUMMY MODEL
class Something()
{
    void Something()
    {
        this.Contact = new HashSet<Contact>( );
    }

    DateTime DOB { get; set; }
    int YearsEmployed { get; set; }
    ICollection<Contact> Contact { get; set; }
}

class Contact()
{
    void Contact()
    {
        this.Address = new HashSet<Address>();
    }

    ICollection<Address> Address { get; set; }
}

class Address()
{
        string Street1 { get; set; }
        string Street2 { get; set; }
        string State { get; set; }
        string City { get; set; }
        string Zip { get; set; }
        OptionName OptionName { get; set; }
}

class PhoneNumber()
{
    string Number
    OptionName OptionName { get; set; }
}

class OptionName()
{
    string OptionName { get; set; }
}
4

1 回答 1

6

没有你的类都不是复杂类型。复杂类型必须遵循严格的规则。它们不能包含导航属性,并且因为它们映射到拥有实体的表,它们不能以任何其他形式表示,除了与拥有实体的一对一关系。

于 2012-04-06T14:53:57.753 回答