EF Code First首先在我的数据库中创建无用的列。为什么?

时间:2012-12-14 14:20:48

标签: asp.net-mvc entity-framework ef-code-first

我有这样的事情:

public class Account
    {
        [Key]
        public Guid AccountId { get; set; }
    }

    public class TransactionHistory
    {
        [Key]
        public int Id { get; set; }
        public Account Sender { get; set; }
        public Account Receiver { get; set; }
    }

我的模型构建器看起来像这样:

modelBuilder.Entity<TransactionHistory>()
                .HasRequired(history => history.Sender)
                .WithMany()
                .Map(s => s.MapKey("Sender"))
                .WillCascadeOnDelete(false);

            modelBuilder.Entity<TransactionHistory>()
                .HasRequired(history => history.Receiver)
                .WithMany()
                .Map(s => s.MapKey("Receiver"))
                .WillCascadeOnDelete(false);

在我的数据库中,我的TransactionHistory表有三列:sender,receiver和Account_AccountId。虽然前两列是好的,但我不想要第三列,我不知道CodeFirst为什么创建它...你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

ICollection<TransactionHistory>中的Account之类的集合将在Account中与其自己的外键建立第三种关系。这是你看到的额外关键。如果您不想要第三个关系,则必须确定要将集合与Account关联的导航属性。要么...

modelBuilder.Entity<TransactionHistory>()
            .HasRequired(history => history.Sender)
            .WithMany(account => account.TransactionHistories)
            .Map(s => s.MapKey("Sender"))
            .WillCascadeOnDelete(false);

...或...

modelBuilder.Entity<TransactionHistory>()
            .HasRequired(history => history.Receiver)
            .WithMany(account => account.TransactionHistories)
            .Map(s => s.MapKey("Receiver"))
            .WillCascadeOnDelete(false);

但不是两者兼而有之。或者删除集合属性,第三个FK将消失。

答案 1 :(得分:0)

我认为这样做会解决它。

[Column("ID")]
[Key]
public int Id { get; set; }

另外,我会考虑将您的映射更改为s.MapKey("SenderAccountID")s.MapKey("ReceiverAccountID")。使在数据库中工作的人员的生活更轻松。