实体框架 - 引用一个表的多个表

时间:2015-02-01 22:05:52

标签: c# sql sql-server entity-framework entity

我带着一个实体框架问题来到这里,我已经困扰了一段时间了。让我们快速描述一下。我有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在关系'LogLocation_ProcessedLog'中的Role'LogLocation_ProcessedLog_Source'中无效。由于“从属角色”属性不是关键属性,因此从属角色的多重性的上限必须为“”。   LogLocation_QueuedLog_Source :: Multiplicity在关系'LogLocation_QueuedLog'中的Role'LogLocation_QueuedLog_Source'中无效。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为“”。

只有当我做一个典型的一对一关系时才有效 - 但这不是我想要的。

顺便说一下。这是我在StackOverflow上的第一篇文章,所以我想向大家打个招呼! :)你正在创建一个伟大的社区,感谢你的所有工作!

修改 问题是:我如何创建这些模型和关系,所以它会像这样工作:

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

1 个答案:

答案 0 :(得分:1)

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

它与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();
}