EF6一对一或零关系(Fluent API)

时间:2015-11-14 11:26:08

标签: c# entity-framework ef-fluent-api

我有这样的课程(简化):

public class Transaction
{
    public int LocalId { get; set; }
    public int MachineId { get; set; }
    public virtual Machine Machine { get; set; }       
    public int? MoneyId { get; set; }
    public virtual TransactionMoney Money { get; set; }
}

public class Machine
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class TransactionMoney
{
    public int LocalId { get; set; }
    public int MachineId { get; set; }
    public virtual Machine Machine { get; set; }
    public int TransactionId { get; set; }
    public virtual Transaction Transaction { get; set; }
}

我想要关系事务1< - > 0 ... 1 TransactionMoney,其中Money中的外键应为TransactionId和MachineId(连接到事务的LocalId和MachineId)。我需要用流畅的API来做这件事。

我尝试的是:

    modelBuilder.Entity<Transaction>()
                .HasOptional(t => t.Money)
                .WithRequired(t => t.Transaction)
                .HasForeignKey() <--- there is no such method

和另一方

modelBuilder.Entity<TransactionMoney>()
    .HasRequired(t => t.Transaction)
    .WithOptional(t => t.Money)
            .HasForeignKey() <--- there is no such method

1 个答案:

答案 0 :(得分:0)

你可以使用这样的东西

modelBuilder.Entity<TransactionMoney>()
    .HasRequired(t => t.Transaction)
    .WithOptional(t => t.Money)
    .Map(a => a.MapKey("TransactionId", "MachineId"));


事实证明,您要定位的设计无法在EF中完成。我能够得到的最接近的如下。但在我离开之前,有一些事情需要注意。 MoneyId字段已从Transaction中删除。 LocalId字段已从TransactionMoney中删除。使用数据注释指定外键。如果其中任何一个是不可接受的,请跳过其余部分。

<强>实体:

public class Transaction
{
    public int LocalId { get; set; }
    public int MachineId { get; set; }
    public virtual Machine Machine { get; set; }
    public virtual TransactionMoney Money { get; set; }
}

public class Machine
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Transaction> Transactions { get; set; }
    public virtual ICollection<TransactionMoney> Money { get; set; }
}

public class TransactionMoney
{
    public int MachineId { get; set; }
    public virtual Machine Machine { get; set; }
    public int TransactionId { get; set; }
    [ForeignKey("TransactionId,MachineId")]
    public virtual Transaction Transaction { get; set; }
}

<强>配置

modelBuilder.Entity<Transaction>()
    .HasKey(t => new { t.LocalId, t.MachineId })
    .HasRequired(t => t.Machine)
    .WithMany(t => t.Transactions)
    .HasForeignKey(t => t.MachineId);

modelBuilder.Entity<TransactionMoney>()
    .HasRequired(t => t.Machine)
    .WithMany(t => t.Money)
    .HasForeignKey(t => t.MachineId);

modelBuilder.Entity<TransactionMoney>()
    .HasKey(t => new { t.TransactionId, t.MachineId })
    .HasRequired(t => t.Transaction)
    .WithOptional(t => t.Money);
相关问题