【发布时间】:2014-04-17 12:46:51
【问题描述】:
我有两个实体Task和Attempt,一个任务有很多Attempt,所以我定义的实体如下。
public class Task
{
public long TaskId { get; set; }
[Required]
public int DestinationNumber { get; set; }
[Required]
public int CountryCode { get; set; }
// blah blah
public virtual ICollection<Attempt> Attempts { get; set; }
}
public class Attempt
{
public long Id { get; set; }
public string AttemptsMetaData { get; set; }
public DateTime Time { get; set; }
public bool Answered { get; set; }
public DateTime Disconnected { get; set; }
// foreign key
public long TaskId { get; set; }
public virtual Task Task { get; set; }
}
我使用 Code First 关系 Fluent API 来映射关系。
public class OutboundContext : DbContext
{
public DbSet<Task> Tasks { get; set; }
public DbSet<Attempt> Attempts { get; set; }
public OutboundContext()
: base("Outbound")
{
Database.SetInitializer<OutboundContext>(new CreateDatabaseIfNotExists<OutboundContext>());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Task>().HasMany(t => t.Attempts).WithRequired();
}
单元测试已通过,但是当我检查表 [Outbound].[dbo].[Attempts] 时。列是
[Id]
,[AttemptsMetaData]
,[Time]
,[Answered]
,[Disconnected]
,[Task_TaskId]
,[Task_TaskId1]
您看到第一个 [Task_TaskId] 是错误的,并且生成了一个额外的列 [Task_TaskId1]。
怎么了?
编辑:
TaskId 应该是外键。
// Add dummy data
public bool AddAttempt(List<Attempt> attempt)
{
using (OutboundContext db = new OutboundContext())
{
foreach (var item in attempt)
{
db.Attempts.Add(item);
}
try
{
db.SaveChanges();
return true;
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
}
List<Attempt> attempts = new List<Attempt>();
Attempt objAtt = new Attempt();
long id = 123456789;
objAtt.AttemptId = id;
objAtt.Time = DateTime.Now;
objAtt.AttemptsMetaData = "test";
objAtt.Answered = true;
objAtt.Disconnected = DateTime.Now;
objAtt.TaskId = 33333333;
attempts.Add(objAtt);
//Then call AddAttempt
【问题讨论】:
-
您是否尝试过自己在代码中添加TaskID(在尝试类中)?这应该在您进行迁移时整理出重复的 task_ids。
-
是的,如果您查看 msdn.microsoft.com/en-us/data/jj591583.aspx。它说:代码优先不能自己匹配两个类中的属性。 Posts 的数据库表应该有一个用于 CreatedBy 人和一个用于 UpdatedBy 人的外键,但代码首先会创建四个外键属性:Person_Id、Person_Id1、CreatedBy_Id 和 UpdatedBy_Id。
-
我们在这里讨论的是基本的一对多关系,我建议在 OnModelCreating 中删除您的流畅 API 代码并进行新的迁移
-
我可以将 Fluent API 和 DataAnnotations 混合在一起吗?
-
是的,但我认为在这种情况下,流畅的 API 会干扰代码优先约定。它应该首先使用代码。
标签: c# .net entity-framework ef-code-first