2011-12-05 115 views
3

考虑以下简化模型:实体框架代码优先一对一约束冲突

public class Account 
{ 
    public Account() 
    { 
     Id = Guid.NewGuid(); 
     ContactCard = new ContactCard(); 
    } 

    //[ForeignKey("ContactCard")] 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public string Number { get; set; } 
    public ContactCard ContactCard { get; set; } 
} 

public class ContactCard 
{ 
    public ContactCard() 
    { 
     Id = Guid.NewGuid(); 
    } 

    public Guid Id { get; set; } 
    public Account Account { get; set; } 
} 

public class MightDbContext: DbContext 
{ 
    public DbSet<Account> Accounts { get; set; } 
    public DbSet<ContactCard> ContactCards { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Account>().HasRequired(x => x.ContactCard).WithOptional(x => x.Account); 
    } 
} 

public class MightDbInitializer : DropCreateDatabaseIfModelChanges<MightDbContext> 
{ 
    protected override void Seed(MightDbContext context) 
    { 
     var accounts = new List<Account> 
     { 
      new Account() 
      { 
       Name = "Acme Corporation Pty. Ltd.", 
       Number = "001ABC" 
      }, 

      new Account() 
      { 
       Name = "Three Little Pigs Pty. Ltd.", 
       Number = "002DEF" 
      } 
     }; 

     accounts.ForEach(c => context.Accounts.Add(c)); 
    } 
} 

而下面这个简单的控制台程序遍历帐户的内容,并ContactCards集合:

static void Main(string[] args) 
    { 
     Database.SetInitializer<MightDbContext>(new MightDbInitializer()); 

     using (var context = new MightDbContext()) 
     { 
      foreach (Account c in context.Accounts) 
      { 
       Console.WriteLine(c.ContactCard.Id); 
      } 

      var contactCards = context.ContactCards.ToList(); /* ERROR OCCURS HERE */ 

      foreach (ContactCard a in contactCards) 
      { 
       Console.WriteLine(a.Id); 
      } 
     } 

     Console.Read(); 
    } 

为什么当我尝试访问ContactCards集合时,是否会收到以下错误:

Multip侵犯了合法性约束。关系“InvestAdmin.Might.DataAccess.Account_ContactCard”的角色“Account_ContactCard_Source”具有多重性1或0..1。

当我看到实际存储在数据库表中的数据似乎都是正确的。其实这里是数据:

Accounts: 
Id Name Number 
ab711bad-1b32-42ca-b68b-12f7be831bd8 Acme Corporation Pty. Ltd. 001ABC 
dc20a1dd-0ed4-461d-bc9c-04a85b555740 Three Little Pigs Pty. Ltd. 002DEF 

ContactCards: 
Id 
dc20a1dd-0ed4-461d-bc9c-04a85b555740 
ab711bad-1b32-42ca-b68b-12f7be831bd8 

而对于完整性这里是在数据库中定义的Account_ContactCard外键约束:

-- Script Date: 06/12/2011 7:00 AM - Generated by ExportSqlCe version 3.5.1.7 
    ALTER TABLE [Accounts] ADD CONSTRAINT [Account_ContactCard] FOREIGN KEY ([Id]) REFERENCES [ContactCards]([Id]) ON DELETE NO ACTION ON UPDATE NO ACTION; 

我一直在阅读我只能在定义一对一的关系在Code First中尝试了许多不同的配置。所有的事情都回到了同样的问题。

回答

2

我发现我可以通过将创建关联的ContactCard从Account构造函数移动到DBInitializer的Seed方法中的Account对象的实际创建来解决此问题。因此,它似乎不是(直接)一对一关系的问题。

+0

这指出我在正确的方向。我在构造函数中实例化一个导航属性。我认为这将被E.F覆盖,但显然不是。一旦我删除了,我不再收到错误消息。谢谢 –

+0

@John Mc,对我来说,删除construrctor的财产是生命的救星 – DEBAL