2011-12-12 48 views
0

我们正在研究EF代码以评估它是否适合我们现有的数据库。数据库的entites的结构是与EF 4.1的一对多关系代码优先 - 使用数据库代替触发器

1)产品(复合键)

INT产品编号:PK(非身份) - 在INSTEAD OF触发器 INT版本从自动生成:PK(非标识) - 自动生成的INSTEAD OF触发器

2)包(复合键)

PackID:PK(非身份) - 在INSTEAD OF触发器 版本从自动生成:PK(非身份) - 在INSTEAD OF触发器 产品ID自动生成的: (不能设置为FK - 设计缺陷traint)

关系:产品有许多包

我们怎样才能出现上述情况与EF代码第一次模拟4.1?


该模型生成过程中试图

public class Product 
{ 
     public int ProductID { get; set; } 
     public string ProductName { get; set; } 
     public short Version { get; set; } 
     public virtual ICollection<Pack> Packs { get; set; } 
} 

public class Pack 
{ 
     public int PackID { get; set; } 
     public int ProductID { get; set; } 
     public short Version { get; set; } 
     public virtual Product Product { get; set; } 
} 
public class ProductContext : DbContext 
{ 
    public DbSet<Pack> Pack { get; set; } 
    public DbSet<Product> Product { get; set; } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<Product>().ToTable("Product"); 
     modelBuilder.Entity<Pack>().ToTable("Pack"); 

     modelBuilder.Entity<Product>() 
        .HasKey(a => new { a.ProductID, a.VersionFrom }); 

     modelBuilder.Entity<Pack>() 
        .HasKey(a => new { a.PackID, a.VersionFrom }); 

     modelBuilder.Entity<Product>().HasMany<Pack>(x => x.Packs).WithRequired().HasForeignKey(p => p.ProductID); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

.... 

var product = new Product { ProductName = "EntTest1"}; 
var pack = new Pack {}; 


      using (var productContext = new ProductContext()) 
      { 

       product.Packs.Add(pack); 
       productContext.Product.Add(product); 
       productContext.SaveChanges(); //**ERROR** 
      } 

....检测

一个或多个验证错误的解决方案:

System.Data.Edm.EdmAssociationConstraint: : Number of Properties in the Dependent and Principal Role in a relationship constraint must be exactly identical. 

请帮助!

回答

1

Pack类需要两个外键标性

public class Pack 
{ 
     public int PackID { get; set; } 
     public int ProductID { get; set; } 
     public short ProductVersion { get; set; } 
     public virtual Product Product { get; set; } 
} 

您需要标量的属性提供给映射

modelBuilder.Entity<Product>() 
.HasMany<Pack>(x => x.Packs).WithRequired(p => p.Product) 
.HasForeignKey(p => new { p.ProductID, p.ProductVersion}); 

编辑:没有映射标性

public class Pack 
{ 
     public int PackID { get; set; } 
     public virtual Product Product { get; set; } 
} 

modelBuilder.Entity<Product>() 
.HasMany<Pack>(x => x.Packs).WithRequired(p => p.Product) 
.Map(m => m.MapKey("ProductID", "ProductVersion")); 

你的Pack(s)表应该有ProductID,ProductVersion列与匹配的数据类型。

+0

有没有可能在不提供标量属性的情况下创建关系。 – Maran

+0

@Maran编辑答案 – Eranga