2012-10-11 27 views
2

好吧我有兩個類:'Plan'和'Material'。一個計劃有0..1個材料,一個材料可以包含在多個計劃中。當創建我的數據庫自動生成的列被命名爲Material_MaterialId,我希望它被命名爲MaterialId通過DataAnnotation強制外鍵列名不起作用

我的「計劃」類:

[Column("MaterialId")] 
public virtual Material Material { get; set; } 

我的「材料」類:

public int MaterialId { get; set; } 

但似乎沒有做任何事情。

回答

2

你應該使用這樣的:

計劃類

public virtual Material Material { get; set; } 

public int? MaterialId { get; set; } /* it prompt clr create foreign key MatherialId which referenced to MatherialId class of Matherial */ 

Matherial類

public int MaterialId { get; set; } 

修訂

完整的解決方案

實體:

namespace MvcApplicationTest.Models 
{ 
    public class Material 
    { 
     public int MaterialId { get; set; } 
     public int Name { get; set; } 
    } 

    public class Plan 
    { 
     public int PlanId { get; set; } 
     public int Name { get; set; } 

     //full navigation property 
     public virtual Material Material { get; set; } 
     public int? MaterialId { get; set; } 
     // 

    } 

    public class TestContext : DbContext 
    { 
     public DbSet<Material> Materials { get; set; } 
     public DbSet<Plan> Plans { get; set; } 
    } 
} 

一些初始化在Global.asax中:

var context = new TestContext(); 
context.Database.CreateIfNotExists(); 

而且結果應該是這樣的:

enter image description here

爲了您的名字:

[ForeignKey("MaterialFK")] 
public virtual Material MyMaterial { get; set; } //your name 
public int? MaterialFK { get; set; } //your name 
+0

在我的觀點我不能使用MaterialId來訪問正常的其他propreties,因爲它是一個int('@ Html.DisplayNameFor(x => x.MaterialId.Name)'不起作用),但是「@ Html.DisplayNameFor x => x.Material.Name)'作品...這有點奇怪 –

+0

爲什麼它很奇怪? MaterialId - 是db中的外鍵,但是Material - 它是EF類中的導航屬性,並且使用導航屬性可以獲取Matherial的名稱。 – testCoder

+0

明白了,對我來說似乎很奇怪,不是很習慣它。但是我被迫從我的另一個班級給我的FK提供PK的名字,如果我想要另一個名字怎麼辦? –

0

也許這樣的事情會做的伎倆:

[Column(Name="MaterialId")] 
public virtual Material Material { get; set; } 

否則,您可以通過覆蓋你的DbContext的OnModelCreating法類似於這樣做:

public class YourContext: DbContext 
{ 
    public DbSet<Plan> Plans { get; set; } 
    public DbSet<Material> Materials { get; set; } 

    public YourContext() 
    : base("YourDb") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    modelBuilder.Entity<Plan>(). 
     HasMany(c => c.Material). 
     Map(
     m => 
     { 
     m.MapLeftKey("MaterialId"); 
     m.MapRightKey("PlanId"); 
     m.ToTable("Plans"); 
     }); 
    } 
} 
+0

不幸的是它不起作用 –