我带着一个实体框架问题来到这里,我已经困扰了一段时间了。让我们快速描述一下。我有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。
答案 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();
}