使用实体框架CTP5映射与旧数据库的关系

时间:2011-02-22 12:56:00

标签: c# .net entity-framework-ctp5 fluent-interface code-first

我无法使用Code First / Fluent API将两个实体与Entity Framework CTP5一起映射。该数据库是我们公司正在转换的另一个应用程序(Exact MAX)中的旧数据库,我正在编写一个应用程序供我自己用于管理仓库中的货件。没有任何内容保存到旧数据库,其中包括本文中提到的实体。

实体是SalesOrder,它只有一个Address和Address,它可以有许多SalesOrders。我必须指定列名称,这是其中一个问题。另一个是Address有两个键,一个Customer ID和一个Address ID,它链接到SalesOrder中的匹配列。列名是可怕的:表SO_Master中的CUSTID_27和SHPCDE_27,用于地址表SHIPPING_MASTER中的SalesOrders,CUSTID_24和SHPCDE_24。

我昨晚最终放弃了。这篇文章中的代码行来自SalesOrder的映射,最后两行用于映射SalesOrder和Address。我从Google搜索中删除了每个键的映射,但我甚至不确定它应该作为两个单独的传递来完成。检索到的地址记录本身可以,但SalesOrders中的地址记录不是。一个检索到的SalesOrder记录具有有效地址,但SalesOrders的其余部分具有空地址。

this.ToTable("SO_Master");

this.HasKey(so => so.Id);

this.Property(so => so.OrderDate).HasColumnName("ORDDTE_27");
this.Property(so => so.Id).HasColumnName("ORDNUM_27");

// Maps Customers
this
    .HasOptional(s => s.Customer)
    .WithMany(c => c.SalesOrders)
    .IsIndependent()
    .Map(m => m.MapKey(c => c.Id, "CUSTID_27"));

// Maps Address
this
    .HasOptional(s => s.Address)
    .WithMany(a => a.SalesOrders)
    .IsIndependent()
    .Map(m => m.MapKey(a => a.CustomerId, "CUSTID_27")); 

this
    .HasOptional(s => s.Address)
    .WithMany(a => a.SalesOrders)
    .IsIndependent()
    .Map(m => m.MapKey(a => a.Id, "SHPCDE_27"));

如果需要,我可以使用数据注释。我可以使用LINQ to SQL,但我想看看是否有使用它的解决方案。也许EF不是这个数据库的最佳选择,但代码分离得足够好,我可以试验。我正在使用Visual Studio Express和SQL Server Express 2008 R2,并且无法找到任何允许使用设计器的东西,所以这就是我使用Code First的原因。

感谢您花时间阅读这篇文章。

好的,我最终采用了Vulgarbinary的建议来使用Data Annotations,并且只在需要它们时使用了ForeignKey属性。我仍然必须使用Fluent API将地址映射到客户。我不确定为什么。在没有Fluent API映射的情况下,地址记录不断回来。我想因为我在地址中有两个键用于链接地址和订单,但只有一个用于客户地址映射。

this.HasRequired(a => a.Customer).WithMany().HasForeignKey(a => a.CustomerId);

我想我现在明白了如何更好地使用Fluent API,但我显然需要阅读更多内容。我或许可以返回并将一些属性更改回Fluent行,但对于我正在处理的应用程序来说,它并不值得。

1 个答案:

答案 0 :(得分:2)

SalesOrderAddress将是this.References(x => x.Address),您将拥有AddressID的单独字段,以便您可以映射外键关联和列名称。< / p>

在地址映射中,您将拥有:

this.WithMany(x => x.SalesOrders)

在您的实际POCO中,FK POCO SalesOrderAddress POCO需要Address

所以在SalesOrder课程中:

Address Address {get;set;} 
int AddressID {get;set;}

在课程地址:

List<SalesOrder> SalesOrders {get;set;}

那应该为你做。

如果我可能会问,为什么要使用Fluent而不是注释?通过注释以及每行代码的生产率一目了然地查看比使用Fluent映射要好得多。