2

我试图更好地理解通过逆向工程师代码优先做出的一些选择背后的原因。

这是架构 - 显示我对用户和附属公司都有 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 在功能上与复杂对象 - Affiliate 相同。idUser -> 用户也是如此。

班级是否有理由同时想要两者?

实体框架电动工具 Beta 2

谢谢

4

2 回答 2

1

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

MyObj.Fkid = 6;

代替

MyObj.FkObj = fkobject;
于 2012-04-16T01:21:59.977 回答
0

在 Entity Framework 中有两种表示外键的方式,on 是实际 ID,另一种是称为 Navigation Properties 的概念。导航属性允许您加入外键引用的附加数据。

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

出于性能原因,您可能很希望在模型中使用这两种方法。如果您使用导航属性来查看您的订单是否有关联公司(或者它是否有具有特定 ID 的关联公司),这将需要在关联公司表上进行连接。

只需查看 FK Id,您就可以在不使用 SQL 中的 Join 的情况下实现相同的目标。

于 2012-04-15T23:56:12.727 回答