Entity Framework - 多个 table 引用一个 table

Entity Framework - Multiple tables referencing to one table

我带着 Entity Framework 问题来到这里,我已经为此苦苦挣扎了一段时间。让我们快速描述一下。我有 2 个模型引用一个模型...我真的不知道如何创建与 EF 注释的关系。

第一个模型:

public class ProcessedLog
{
    [Key]
    public int Id { get; set; }

    // Some other data

    public virtual LogLocation Location { get; set; }
}

第二个模型:

public class QueuedLog
{
    [Key]
    public int Id { get; set; }

    // Some other data

    public virtual LogLocation Location { get; set; }
}

以及我所引用的模型:

public class LogLocation
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("QueuedLog")]
    public int QueuedLogId { get; set; }

    [ForeignKey("ProcessedLog")]
    public int ProcessedLogId { get; set; }

    // Some other data

    public virtual QueuedLog QueuedLog { get; set; }
    public virtual ProcessedLog ProcessedLog { get; set; }
}

如您所见,我已经尝试过一些操作,但效果不佳。我收到一个错误:

LogLocation_ProcessedLog_Source: : Multiplicity is not valid in Role 'LogLocation_ProcessedLog_Source' in relationship 'LogLocation_ProcessedLog'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be ''. LogLocation_QueuedLog_Source: : Multiplicity is not valid in Role 'LogLocation_QueuedLog_Source' in relationship 'LogLocation_QueuedLog'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be ''.

只有当我建立典型的一对一关系时它才有效——但这不是我想要的。

顺便说一句。这是我第一次 post 在 Whosebug,所以我想向大家打个招呼! :) 您正在创建一个很棒的社区,感谢您所做的所有工作!

编辑 问题是:我如何创建这些模型和关系,以便它像这样工作:

我将新的 ProcessedLog 添加到 Db -> 它添加了一个新的 LogLocation,其 ProcessedLogId 等于相关的 ProcessedLog 并且 QueuedLogId 为 NULL。

你可以这样做。数据库方面,我不确定这是否是一个很好的解决方案......虽然它看起来确实适合你。

它适用于 EntityFramework 6.1.3 和 SQL Server Express。

ProcessedLog.cs

public class ProcessedLog
{
    [Key]
    public int Id { get; set; }

    // Some other data

    public virtual LogLocation Location { get; set; }
}

QueuedLog.cs

public class QueuedLog
{
    [Key]
    public int Id { get; set; }

    // Some other data

    public virtual LogLocation Location { get; set; }
}

LogLocation.cs

public class LogLocation
{
    [Key]
    public int Id { get; set; }

    // Some other data

    public virtual QueuedLog QueuedLog { get; set; }
    public virtual ProcessedLog ProcessedLog { get; set; }
}

Context.cs

public class Context : DbContext
{
    public DbSet<ProcessedLog> ProcessedLogs { get; set; }
    public DbSet<QueuedLog> QueuedLogs { get; set; }
    public DbSet<LogLocation> LogLocations { get; set; }

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

        modelBuilder.Entity<ProcessedLog>()
                    .HasRequired(p => p.Location)
                    .WithOptional(l => l.ProcessedLog);

        modelBuilder.Entity<QueuedLog>()
                    .HasRequired(p => p.Location)
                    .WithOptional(l => l.QueuedLog);
    }
}

还有我测试过的代码

using (var context = new Context())
{
    var processedLog = new ProcessedLog
    {
        Location = new LogLocation()
    };

    var queuedLog = new QueuedLog
    {
        Location = new LogLocation()
    };

    context.ProcessedLogs.Add(processedLog);
    context.QueuedLogs.Add(queuedLog);

    context.SaveChanges();
}