2012-04-15 19 views
2

我想更好地理解一些通过逆向工程师代码优先选择背后的推理。实体框架代码首先代码生成既创建基于int的FK又创建复杂对象,为什么?

这个模式 - 显示我对用户和会员都有FK。

CREATE TABLE [dbo].[Orders] (
    [ID]     INT    IDENTITY (1, 1) NOT NULL, 
    [idUser]    INT    NOT NULL, 
    [orderDate]   SMALLDATETIME NOT NULL, 
    [total]    MONEY   NOT NULL, 
    [idAffiliate]   INT    NOT NULL, 
    CONSTRAINT [PK_cartHead] PRIMARY KEY CLUSTERED ([ID] ASC) WITH (FILLFACTOR = 90), 
    CONSTRAINT [FK_Orders_Affiliates] FOREIGN KEY ([idAffiliate]) REFERENCES [dbo].[Affiliates] ([ID]), 
    CONSTRAINT [FK_Orders_Users] FOREIGN KEY ([idUser]) REFERENCES [dbo].[Users] ([ID]) 
); 

这里的RE的一代:

... 
     public int ID { get; set; } 
     public int idUser { get; set; } 
     public System.DateTime orderDate { get; set; } 
     public decimal total { get; set; } 
     public int idAffiliate { get; set; } 
     public virtual Affiliate Affiliate { get; set; } 
     public virtual User User { get; set; } 
     public virtual ICollection<OrdersRow> OrdersRows { get; set; } 

OrderMap.cs

// Table & Column Mappings 
    this.ToTable("Orders"); 
    this.Property(t => t.ID).HasColumnName("ID"); 
    this.Property(t => t.idUser).HasColumnName("idUser"); 
    this.Property(t => t.orderDate).HasColumnName("orderDate"); 
    this.Property(t => t.total).HasColumnName("total"); 
    this.Property(t => t.initiatedBy).HasColumnName("initiatedBy"); 
    this.Property(t => t.idAffiliate).HasColumnName("idAffiliate"); 

    // Relationships 
    this.HasRequired(t => t.Affiliate) 
     .WithMany(t => t.Orders) 
     .HasForeignKey(d => d.idAffiliate); 
    this.HasRequired(t => t.User) 
     .WithMany(t => t.Orders) 
     .HasForeignKey(d => d.idUser); 

我很好奇是什么样子的复制 - 对idAffiliate在功能上是一样的复杂对象 - 会员。 idUser - > User也一样。

是否有理由这两个类都想要?

Entity Framework Power Tools Beta 2

THX

+0

查看关于一个很好的讨论:http://www.ladislavmrnka.com/2011/05/foreign-key-vs-independent-associations-in-ef- 4 / – 2012-04-16 12:17:47

回答

0

内部实体框架也有代表外键的两种方式,在为实际的ID,另一种是被称为导航属性的概念。导航属性允许您基本上加入由外键引用的其他数据。

导航属性是编码连接数据的好方法,因为它们允许实体引用的简单易读的代码。它也符合C#的对象。

出于性能原因,您可能很希望在模型中使用这两种方法。如果您使用导航属性查看您的订单是否有会员(或者是否有会员使用特定ID),则需要在会员表上加入会员。

只需查看FK ID,即可在不使用SQL中的Join的情况下实现同样的目的。

1

拥有fk id属性的一个很好的理由是您可以轻松更改它们,而无需在内存中加载任何额外的对象。

MyObj.Fkid = 6; 

而不是

MyObj.FkObj = fkobject; 
相关问题