2016-11-20 3 views
0

を必要と私が持っている:Entity Frameworkの循環参照の両方で同じテーブルで私は ポイあるすべての転送のために行のペアを持ちたい

public class Transfer : DependentRestrictedEntity 
{ 
    public virtual Account Acount { set; get; } 
    public DateTime Time { set; get; } 
    public Transfer PairedTransfer { set; get; } 
    [NotMapped] 
    public override RestrictedEntity DependentOn => Acount; 
    //other code. 
} 

public class Account : RestrictedEntity 
{   
    public string Name { get; set; } 
    //other code. 
} 

public class RestrictedEntity : Entity 
{ 
    public Filter Filter { get; set; } 
    //other code. 
} 

public abstract class DependentRestrictedEntity : RestrictedEntity 
{ 
    [NotMapped] 
    public abstract RestrictedEntity DependentOn { get; } 
    //other code. 
} 

public class Entity 
{ 
    [Key, JsonProperty, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid ID { set; get; } 
    //other code. 
} 

public class MyMoneyContext : UserDbContext 
{ 
    public DbSet<Account> Accounts { get; set; } 
    public DbSet<Transfer> Transfers { get; set; } 

    protected override void OnModelCreating(DbModelBuilder _modelBuilder) 
    { 
     base.OnModelCreating(_modelBuilder); 


     _modelBuilder.Entity<Transfer>() 
      .HasRequired(_t => _t.PairedTransfer) 
      .WithRequiredDependent(); 
    } 
    //other code 
} 

は、どういうわけか私は2つの送迎をペアリングする必要があります。そのうちの1つは第1のアカウントに属し、第2のアカウントは第2のアカウントに属している必要があります。最初にアカウントを作成する権限を持っているが、2番目のアカウントへのアクセス許可を持っていないユーザーは、両方のエントリを見ることができないはずです。

ここでの問題は、新しいエントリを追加する方法がわからないことです。私は試しました:

var accounts = Database.Accounts.ToList(); 
Transfer pair, pair2; 
Database.Transfers.Add(
    pair = new Transfer() 
    { 
     ID = Guid.NewGuid(), 
     Ammount = 100, 
     Filter = accounts[0].Filter, 
     Acount = accounts[0], 
    } 
); 

Database.Transfers.Add 
(
    pair2 = new Transfer() 
    { 
     ID = Guid.NewGuid(), 
     Ammount = -100, 
     Filter = accounts[1].Filter, 
     Acount = accounts[1], 
    } 
); 
pair.PairedTransfer = pair2; 
pair2.PairedTransfer = pair; 

Database.SaveChanges(); 

しかし、私は循環参考問題になっています。

答えて

0

問題は、EFがどの1. 2.および2を参照を持っている(それは外部キーを割り当てることはできません)

Iを1への参照を持っているので、最初のDBに追加転送知らないということです最初にPairedTransferを使って最初の転送を挿入し、最初に割り当てられた2番目のPairedTransferを挿入し、最後に最初のPairedTransferに2番目の転送に割り当てます。

+0

私は問題を理解しています。 どちらも必須です(nullでない)ので、nullで1行追加する方法はわかりません。 – Vasoli

+0

ああ、私は流暢なAPIを使ってPairedTransferが必須であることを知っています。その場合、nullの役割を持ついくつかの "ダミー"転送を使うことができます。または可能であれば、必要に応じてそれを述べないでください。 – MacakM

+0

第1ダミーオブジェクトの作成方法。おそらくそのオブジェクト自体を参照することができますか?どういうわけか、そのすべてが1回の取引であると言えますか?私はdbに一貫性を持たせたくありません。 – Vasoli

関連する問題