Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 4.1 EF 4.1代码优先的一对多关系-数据库使用Instead of触发器_Entity Framework 4.1_Ef Code First_One To Many - Fatal编程技术网

Entity framework 4.1 EF 4.1代码优先的一对多关系-数据库使用Instead of触发器

Entity framework 4.1 EF 4.1代码优先的一对多关系-数据库使用Instead of触发器,entity-framework-4.1,ef-code-first,one-to-many,Entity Framework 4.1,Ef Code First,One To Many,我们正在研究EF代码,首先评估它是否适合我们现有的数据库。数据库实体的结构如下所示: 1) 产品(复合钥匙) int Product ID:PK(非标识)-在中自动生成,而不是触发器 int Version From:PK(非标识)-在中自动生成,而不是触发器 2) 套装(复合钥匙) PackID:PK(非身份)-在中自动生成,而不是触发器 版本来源:PK(非标识)-在中自动生成,而不是触发器 产品ID:(不能设置为FK-设计约束) 关系:产品有很多包装 我们如何使用EF Code First

我们正在研究EF代码,首先评估它是否适合我们现有的数据库。数据库实体的结构如下所示:

1) 产品(复合钥匙)

int Product ID:PK(非标识)-在中自动生成,而不是触发器 int Version From:PK(非标识)-在中自动生成,而不是触发器

2) 套装(复合钥匙)

PackID:PK(非身份)-在中自动生成,而不是触发器 版本来源:PK(非标识)-在中自动生成,而不是触发器 产品ID:(不能设置为FK-设计约束)

关系:产品有很多包装

我们如何使用EF Code First 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**
            }

请帮忙

您的
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; }
}
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"));
您需要为映射提供两个标量属性

modelBuilder.Entity<Product>()
.HasMany<Pack>(x => x.Packs).WithRequired(p => p.Product)
.HasForeignKey(p => new { p.ProductID, p.ProductVersion});
modelBuilder.Entity()
.HasMany(x=>x.Packs)。WithRequired(p=>p.Product)
.HasForeignKey(p=>new{p.ProductID,p.ProductVersion});
编辑:不映射标量属性

public class Pack
{
        public int PackID { get; set; }
        public int ProductID { get; set; }
        public short ProductVersion { get; set; }
        public virtual Product Product { get; set; }
}
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"));
公共类包
{
public int PackID{get;set;}
公共虚拟产品产品{get;set;}
}
modelBuilder.Entity()
.HasMany(x=>x.Packs)。WithRequired(p=>p.Product)
.Map(m=>m.MapKey(“ProductID”、“ProductVersion”);

您的
Pack
表中应该有
ProductID
ProductVersion
列以及匹配的数据类型。

是否可以在不提供标量属性的情况下创建关系。