【问题标题】:Entity Framework Circular Reference in same table with both required同一张表中的实体框架循环引用,两者都需要
【发布时间】:2016-11-20 15:03:05
【问题描述】:

我希望每次传输都有一对 poi 行 我有:

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 转移。其中一个应该属于第一个帐户,第二个应该属于第二个帐户。对第一个帐户有权限但对第二个帐户没有权限的用户应该不能看到这两个条目。

这里的问题是我不知道如何添加新条目。我试过了:

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();

但我遇到循环引用问题。

【问题讨论】:

    标签: c# entity-framework ef-code-first code-first one-to-one


    【解决方案1】:

    问题是 EF 不知道哪个 Transfer 首先添加到 DB,因为 1. 引用了 2. 和 2. 引用了 1.(所以它不能分配外键)

    我建议使用 null PairedTransfer 插入第一个传输,然后插入第二个分配的第一个 PairedTransfer,最后将第二个传输分配给​​第一个的 PairedTransfer :)

    【讨论】:

    • 我明白是什么问题,只是不知道如何解决。但是两者都是必需的(不是null),所以不知道如何添加一行null?
    • 哦,现在我看到您使用流利的 API 来声明 PairedTransfer 是必需的......所以在这种情况下,您可以使用一些“虚拟”传输,它将具有 null 的角色(仅用于此目的)。或者,如果可以,请不要按要求说明。
    • 以及如何创建第一个虚拟对象。也许那个对象可以引用自己?我可以以某种方式说所有这些都在 1 笔交易中吗?我不想让 db 不一致。
    • 我不确定这是否可行,只需尝试引用自身并写入结果 :) 是的,您可以使用 context.Database.BeginTransaction()) 在 1 个事务中执行此操作
    • 自我参考有效。但无论如何,我想找到一些更好的解决方案。
    猜你喜欢
    • 2014-03-17
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多