2012-12-21 26 views
0

我使用EF5,我需要建立以下關係多重的EF一到一個

  • 一到一個SavedApplicationQueue和SavedApplication
  • 之間
  • 一到一個BatchApplicationQueue和BatchApplication之間
public abstract class BaseEntity 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public virtual int Id { get; set; } 
} 
public abstract class Queue : BaseEntity 
{ 
    public string Status { get; set; } 
    public DateTime? LastRun { get; set; } 
} 
public abstract class Application : BaseEntity 
{ 
    public string ApplicationInhertirot { get; set; } 
    public string AnotherApplicationInhertirot { get; set; } 
} 

public class BatchApplication : Application 
{ 
    public bool BatchAppFlag { get; set; } 
    public string BatchAppString { get; set; } 
    public virtual BatchApplicationQueue BatchApplicationQueue { get; set; } 
} 

public class SavedApplication : Application 
{ 
    public bool SavedAppFlag { get; set; } 
    public string SavedAppString { get; set; } 
    public virtual SavedApplicationQueue SavedApplicationQueue { get; set; } 
} 

public class SavedApplicationQueue : Queue 
{ 
    [Required] 
    [ForeignKey("SavedApplication")] 
    public virtual SavedApplication SavedApplication { get; set; } 
} 

public class BatchApplicationQueue :Queue 
{ 
    [Key] 
    [ForeignKey("BatchApplication")] 
    public override int Id { get; set; } 

    [Required] 
    public virtual BatchApplication BatchApplication { get; set; } 
} 

流利的我已經是

modelBuilder.Entity<Application>() 
      .Map<SavedApplication>(m => 
       { 
        m.ToTable("SApplication"); 
        m.MapInheritedProperties(); 
       }) 
      .Map<BatchApplication>(m => 
       { 
        m.ToTable("BApplication"); 
        m.MapInheritedProperties(); 
       }); 

modelBuilder.Entity<Queue>() 
      .Map<SavedApplicationQueue>(m => 
       { 
        m.ToTable("SavedApplicationQueue"); 
        m.MapInheritedProperties(); 
       }) 
      .Map<BatchApplicationQueue>(m => 
       { 
        m.ToTable("BatchApplicationQueue"); 
        m.MapInheritedProperties(); 
       }); 

我的問題是,當我試圖創建/添加記錄

試驗方法Ef.Model.Test.UnitTest1.TestMethod1拋出異常: System.InvalidOperationException:序列包含一個以上的匹配元素

我覺得它有什麼做的標識,但我只是想描述

+0

您也可以在不使用所有modelBuilder cruft的情況下完成此操作,只需在模型上使用屬性即可:http://stackoverflow.com/a/12693879/176877 –

回答

0

首先建立的關係和多樣性,excep (顯然)是由於映射。你做modelBuilder.Entity<Application>()然後映射兩種不同的類型。一個正確的TPT映射將是:

modelBuilder.Entity<SavedApplication>() 
      .Map(m => 
       { 
       m.ToTable("SApplication"); 
       m.MapInheritedProperties(); 
       }); 
modelBuilder.Entity<BatchApplication>() 
      .Map(m => 
       { 
       m.ToTable("BApplication"); 
       m.MapInheritedProperties(); 
       }); 

modelBuilder.Entity<SavedApplicationQueue>() 
      .Map(m => 
       { 
       m.ToTable("SavedApplicationQueue"); 
       m.MapInheritedProperties(); 
       }); 
modelBuilder.Entity<BatchApplicationQueue>() 
      .Map(m => 
       { 
       m.ToTable("BatchApplicationQueue"); 
       m.MapInheritedProperties(); 
       }); 

其次,雖然你不問,但重寫Id有點奇怪,沒有必要。這樣的代碼將映射兩個1:1關聯。