2016-02-05 52 views
0
public class Admin : EntityTypeConfiguration<Admin> 
{ 
    //[ForeignKey("Blog")] -- If I enable this, it compiles 
    public int AdminId { get; set; } 
    public string AdminName { get; set; } 
    public string AdminPicture { get; set; } 

    //[Required] -- Or If I enable this, it compiles 
    public virtual Blog Blog { get; set; } 
} 

public class Blog : EntityTypeConfiguration<Blog> 
{ 
    public int BlogId { get; set; } 
    public string BlogName { get; set; } 
    public string BlogUrl { get; set; } 

    public virtual Admin Admin { get; set; } 

    public Blog() 
    { 
     HasRequired(a => a.Admin).WithRequiredPrincipal(b=>b.Blog); 
    } 
} 

只要我定義HasRequired和WithRequiredPrincipal鍵,爲什麼VS仍然會創建下面的錯誤。WithRequiredPrincipal,爲什麼還要定義Required或ForeignKey才能編譯?

無法確定類型'Dummy.Models.Blog'和'Dummy.Models.Admin'之間關聯的主要端點。該關聯的主要目的必須使用關係流暢API或數據註釋來顯式配置。 。

第二件事是,即使啓用[要求]或[ForeingKey] ATTR,在EDMX設計師,我只看到1 - 0..1但我必須看,1 - 1(兩端需要)

+0

對不起,我的意思是;只要我定義了HasRequired和WithRequiredPrincipal鍵,它就會編譯罰款VS仍然會產生以下錯誤。 –

回答

0

1-1數據庫級別的關係不可能,因爲您不能同時插入兩行。 1-1只能在課堂驗證水平上使用。

要建立1-1關係,依賴實體的主鍵必須是主體實體的外鍵;這是建立1-1關係的唯一途徑。所以,你必須做如下修改(考慮到你正在使用EF的Code First):

public class Admin 
{ 
    public int AdminId { get; set; } 
    public string AdminName { get; set; } 
    public string AdminPicture { get; set; } 

    public virtual Blog Blog { get; set; } 
} 

博客不應該有自己的BlogId,因爲博客是屬於管理員和管理員只能有一個博客(1-1關係)。如果您使用AdminId FK創建BlogId,則您將創建1-n關係。此外,不要將實體類與映射類混合,它們應該是不同的東西。請參見下面的示例:

public class Blog 
{ 
    public int AdminId { get; set; } //PK AND FK 
    public string BlogName { get; set; } 
    public string BlogUrl { get; set; } 

    public virtual Admin Admin { get; set; }   
} 

創建具有一個映射類的關係:

public class BlogMapping : EntityTypeConfiguration<Blog> 
{ 
    public BlogMapping() 
    { 
     HasKey(i => i.AdminId); 

     HasRequired(a => a.Admin) 
      .WithRequiredDependent(i => i.Blog); 
    } 
} 

註冊的DbContext類內的映射:

public class MyDbContext : DbContext 
{ 
    public DbSet<Admin> Admins { get; set; } 
    public DbSet<Blog> Blogs { get; set; } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new BlogMapping()); 
    } 
} 

這將產生以下遷移:

CreateTable(
    "dbo.Admins", 
    c => new 
     { 
      AdminId = c.Int(nullable: false, identity: true), 
      AdminName = c.String(), 
      AdminPicture = c.String(), 
     }) 
    .PrimaryKey(t => t.AdminId); 

CreateTable(
    "dbo.Blogs", 
    c => new 
     { 
      AdminId = c.Int(nullable: false), 
      BlogName = c.String(), 
      BlogUrl = c.String(), 
     }) 
    .PrimaryKey(t => t.AdminId) 
    .ForeignKey("dbo.Admins", t => t.AdminId) 
    .Index(t => t.AdminId); 

希望這有助於!

+0

非常感謝。 1,爲什麼我在edmx設計器中看到1 .. 0.1而不是兩個表之間的1 .. 1關係?因爲在數據庫級別不可能? 2,我將實體類與映射類混合在一起,以便能夠立即看到它們。會導致問題嗎? –

+0

爲什麼你有一個edmx設計師?您是使用數據庫優先還是代碼優先?看到這個線程幫助http://stackoverflow.com/questions/5446316/code-first-vs-model-database-first。是的,你不應該將實體類和映射類混合在一起。否則,你將無法使用它們,你會得到一個錯誤 –

+0

我首先使用代碼,查看圖中的關係,創建數據庫後,我使用https://github.com/ErikEJ創建了edmx/SqlCeToolbox也許這是misranlating關係不確定.. 混合他們時我沒有得到任何錯誤。你可以嘗試我的代碼來查看結果。 –