gpt4 book ai didi

c# - 在带有 Entity Framework 的 ASP.NET MVC 中,此上下文仅支持原始类型或枚举类型

转载 作者:行者123 更新时间:2023-11-30 12:41:10 24 4
gpt4 key购买 nike

我正在创建一个示例 ASP.NET MVC Web 应用程序,并且我正在遵循数据库的代码优先方法。我想创建 products表和 transactions表,另外我想通过迁移包含一些示例数据,但是当我尝试做 Update-Database我收到标题中提到的错误消息。我确切地知道为什么会发生错误,那是因为我使用了 List<Product> ,如下所示。但是,我不知道如何解决这个问题,而交易应该包括一种或多种产品。我的代码段可以在下面找到。

public class Product
{
public int ProductID { get; set; }

public string Name { get; set; }

}

public class Transaction
{
public int TransactionID { get; set; }

public List<Product> Products { get; set; }

}

我还在 IdentityModels.cs 中添加了以下代码行文件:

public DbSet<Product> Products { get; set; }

public DbSet<Transaction> Transactions { get; set; }

最后,我的 Configuration.cs保存迁移的文件,如下所示:

public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}

protected override void Seed(MyApp.Models.ApplicationDbContext context)
{
var pr = new List<Product>();
pr.Add(new Product { Name = "Book" });
pr.Add(new Product { Name = "Table" });
pr.Add(new Product { Name = "Chair" });

pr.ForEach(i => context.Products.AddOrUpdate(p => p.Name, i));
context.SaveChanges();

context.Transactions.AddOrUpdate(
t => t.Products,
new Transaction { Products = new List<Product>(pr.Where(p => p.Name == "Book" || p.Name == "Table")) },
new Transaction
{
Products = new List<Product>(pr.Where(p => p.Name == "Chair" || p.Name == "Book" || p.Name == "Table"))
}
);

context.SaveChanges();
}

最佳答案

问题是 AddOrUpdate 方法的第一个参数,即 identifierExpression。你应该在那里提供一个原始类型,它决定了你什么时候想要更新以及什么时候添加。如果数据库中的一行与 identifierExpression 匹配,它将更新为您提供的新行。如果没有,新的将被插入到数据库中。

您使用 t.Products 作为标识符,这意味着,当您添加的产品具有与数据库行之一相同的 Products 时,应该进行更新,这不能是正确的,因为 Products 没有原始类型。所以你可以提供一个基本类型的属性或者根本不使用这个参数(这意味着所有的项目都将被插入)。

context.Transactions.AddOrUpdate(
//t => t.Products, //comment this
new Transaction {
Products = new List<Product>(
pr.Where(p => p.Name == "Book" || p.Name == "Table"))
},
new Transaction
{
Products = new List<Product>(
pr.Where(p => p.Name == "Chair" || p.Name == "Book" || p.Name == "Table"))
}
);

建议

从您的Seed 方法可以推断出TransactionProduct 之间的关系是多对多的。如果是这样,您应该为 EF 指定它。根据您当前的模型,关系是一对多的。您可以这样更改它(在 Context 类中):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Transaction>().HasMany(x => x.Products).WithMany();
}

附带说明一下,如果您想将延迟加载添加到您的模型中,您应该将 TransactionProducts 属性声明为 virtual

关于c# - 在带有 Entity Framework 的 ASP.NET MVC 中,此上下文仅支持原始类型或枚举类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38551213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com