【发布时间】:2012-03-12 07:08:11
【问题描述】:
我先用EF4.3.1的代码,我的代码如下,
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
using (var context = new myContext())
{
TestA ta = new TestA();
ta.Name = "Hero";
TestB tb = new TestB();
tb.Name = "Allen";
TestC tc = new TestC();
tc.Name = "Iverson";
ta.tb = tb;
ta.tc = tc;
context.testASet.Add(ta);
}
}
}
class TestA
{
public int ID { get; set; }
public string Name { get; set; }
public TestB tb { get; set; }
public TestC tc { get; set; }
}
class TestB
{
public int ID { get; set; }
public string Name { get; set; }
public TestA ta { get; set; }
}
class TestC
{
public int ID { get; set; }
public string Name { get; set; }
public TestA ta { get; set; }
}
class myContext : DbContext
{
public DbSet<TestA> testASet { get; set; }
public DbSet<TestB> testBSet { get; set; }
public DbSet<TestC> testCSet { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<TestB>().HasOptional(x => x.ta).WithRequired();
modelBuilder.Entity<TestC>().HasOptional(x => x.ta).WithRequired();
modelBuilder.Entity<TestA>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<TestB>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<TestC>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
}
}
当我调试项目时,抛出异常,“操作失败,因为表 'TestAs' 上已经存在名称为 'IX_ID' 的索引或统计信息。” 但是,如果我从代码中删除“TestC”,只有“TestA”和“TestB”,修改代码如下,
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
using (var context = new myContext())
{
TestA ta = new TestA();
ta.Name = "Hero";
TestB tb = new TestB();
tb.Name = "Allen";
ta.tb = tb;
context.testASet.Add(ta);
}
}
}
class TestA
{
public int ID { get; set; }
public string Name { get; set; }
public TestB tb { get; set; }
}
class TestB
{
public int ID { get; set; }
public string Name { get; set; }
public TestA ta { get; set; }
}
class myContext : DbContext
{
public DbSet<TestA> testASet { get; set; }
public DbSet<TestB> testBSet { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<TestB>().HasOptional(x => x.ta).WithRequired();
modelBuilder.Entity<TestA>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<TestB>().Property(x => x.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
}
}
一切正常。有人知道为什么会抛出异常吗?
【问题讨论】:
-
我以为我们有tackled this?再次,您有两次
HasOptional(...).WithRequired()。
标签: entity-framework ef-code-first code-first one-to-one