2013-11-15 36 views
0

识别关键在我的EF6代码第一种模式,我有以下类:EF不是关系

class User : IdentityUser // so it has public string Id! 
{ 
    public virtual long ItemId { get; set; } 
    public virtual Item Item { get; set; } 
} 

class Item 
{ 
    public virtual long Id { get; set; 
    public virtual string UserId { get; set; } 
    public virtual User User { get; set; } 
} 

,并在我的情况下,我做了以下内容:

OnModelCreating(DbModelBuilder mB) 
{ 
    mB.Entity<User>().HasOptional(x => x.Item).WithOptionalPrincipal(x => x.User).WillCascadeOnDelete(false); 
} 

但是,我的迁移产生以下内容:

CreateTable(
      "dbo.Items", 
      c => new 
       { 
        Id = c.Long(nullable: false, identity: true), 
        UserId = c.String(), 
        User_Id = c.String(maxLength: 128), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.Users", t => t.User_Id) 
      .Index(t => t.User_Id); 

我忘记了什么?

更新:我也尝试添加[ForeignKey("User")]Item.UserId

UPDATE2: 我发现了一个解决办法,但它不是东西,是很...

OnModelCreating(DbModelBuilder mB) 
{ 
    mB.Entity<User>().HasOptional(x => x.Item).WithMany().HasForeignKey(x => x.ItemId); 
    mB.Entity<Item>().HasOptional(x => x.User).WithMany().HasForeignKey(x => x.UserId); 
} 
+0

为什么你只有虚拟财产? – jannagy02

+0

只是由类图生成的,稍后会更改 – Nefarion

+0

您是试图定义一对一还是一对一,还是一对一,还是实际上想要一对一-许多? http://msdn.microsoft.com/en-us/data/jj591620.aspx – Colin

回答

0

据我了解,实体框架通过使两个实体共享相同的主键来实施一对一的关系。这意味着不需要单独的外键列,因为主键属性也充当外键。

因此,去除多余的外键,改变项目的关键字符串类型,以便它可以指的是用户的ID:

class User : IdentityUser // so it has public string Id! 
{ 
    public virtual Item Item { get; set; } 
} 

class Item 
{ 
    public string Id { get; set;} 
    public virtual User User { get; set; } 
} 

现在,当需要的关系的两端或两者双方是可选的实体框架不能识别依赖和委托人。依赖关系是获取引用委托人密钥的外键的依赖关系。

那么试试这个:

modelBuilder.Entity<User>() 
      .HasOptional(f => f.Item). //Item is dependent and 
             //gets the foreign key 
      .WithOptionalPrincipal(s => s.User); 

限制性条文

我没有尝试过这样或这样做,位我不明白的是这一点。 如果两端都是可选的,那么Item如何才能获得也是主键的User的外键?主键是必需的,但可选的外键不是。所以他们不可能是同一个人。

所以,如果EF现在又增加一个可选的外键,我将一个唯一索引添加到它,以确保它是1比1。由于它是空的,你需要使用SQL在迁移它做

Sql("CREATE INDEX ON Item(User_Id) UNIQUE WHERE User_Id IS NOT NULL")

参考文献:

http://msdn.microsoft.com/en-us/data/jj713564

http://msdn.microsoft.com/en-us/data/jj591620.aspx

它说s表示页上:

当关系的两端都是可选的,使用 WithOptionalPrincipal或WithOptionalDependent的HasOptional 方法之后。

Do I define a relationship between two entities on the dependent or the principal?