实体框架、导航属性、调用值并将值存储在数据库表中

本文关键字:存储 数据库 导航 属性 调用 实体 框架 | 更新日期: 2023-09-27 18:27:50

我正在尝试使用C Sharp和T-SQL将一个文本文件解析为3个表。以下是表格定义-1) TTransaction(TransactionID Identity(1,1),其他一些属性)
2) TMatch(MatchID Identity(1,1),其他一些属性)
3) TTransactionXTMatch(TransactionID,MatchID)

使用C sharp,我将数据解析为表TTransaction和TMatch。我不知道如何使用实体框架的导航属性来填充TTransactionXTMatch(Bridge)表中的这两个ID。TTransaction和TMatch之间存在一对多的关系。请参阅以下代码:

 TTransaction txn = new TTransaction();
                        txn.TRN = txnNo;
                        txn.Amount = Convert.ToDecimal(Amount);
                        txn.TransactionText = Convert.ToString(txnText);
                        txn.TransactionLocation = TxnLOC;
                        context.TTransactions.Add(txn); 
                        context.SaveChanges();
 TMatch Mtc = new TMatch();
                        Mtc.RiskWord = RiskWord;
                        Mtc.GoodGuyWord = GoodGuyWord;
                        Mtc.Origin = Origin;
                        Mtc.Location = Location;
                        context.TMatches.Add(Mtc); //Adding to the database
                        context.SaveChanges();

我想知道如何调用TTransactionXTMatch表,因为它没有出现在模型中,也没有为它创建类。它确实显示在导航属性中,但我不知道如何使用它。有人能解释一下吗。如果你需要更多关于我正在做的事情的信息,请告诉我。

提前感谢!

实体框架、导航属性、调用值并将值存储在数据库表中

这里有一个Code first示例。请注意,在这个示例中,首先创建了一堆客户,然后创建了一批产品(现实世界就是这样)。然后,为了显示多对多,我们通过循环中的products属性(导航属性)向客户添加随机数量的产品,剩下的由EF完成

string defaultConString = @"server=.'SQLExpress;Database=CodeFirstDbSample;Trusted_Connection=yes;";
void Main()
{
    CreateSampleCodeFirstData();
    ListData();
}
private void CreateSampleCodeFirstData()
{
    var ctx = new MyContext(defaultConString);
  for (int i = 0; i < 10; i++)
  {
    var c = new Customer { CustomerName="c" + i };
    ctx.Customers.Add( c );
  }
  for (int i = 0; i < 10; i++)
  {
    var p = new Product { ProductName="p" + i };
    ctx.Products.Add( p );
  }
  ctx.SaveChanges();
  for (int i = 0; i < 10; i++)
  {
    var customer = ctx.Customers.Single (c => c.CustomerName == "c"+i);
    var products = ctx.Products.OrderBy (p => Guid.NewGuid()).Take(3);
    customer.Products = new List<Product>();
    customer.Products.AddRange( products );
  }
  ctx.SaveChanges();
}
private void ListData()
{
  var ctx = new MyContext(defaultConString);
  Console.WriteLine ("By Customer");
  Console.WriteLine ("".PadRight(50,'-'));
  foreach (Customer c in ctx.Customers.Include("Products"))
  {
    Console.WriteLine ("{0}: {1}", c.CustomerId, c.CustomerName);
    Console.WriteLine ("'t't{0}", 
      string.Join(",", c.Products.Select (p => p.ProductName)));
  }
  Console.WriteLine ("".PadRight(50,'='));
  Console.WriteLine ();
  Console.WriteLine ("By Product");
  Console.WriteLine ("".PadRight(50,'-'));
  foreach (Product p in ctx.Products.Include("Customers"))
  {
    Console.WriteLine ("{0}: {1}", p.ProductId, p.ProductName);
    Console.WriteLine ("'t't{0}", 
       string.Join(",", p.Customers.Select (c => c.CustomerName) ));
  }
  Console.WriteLine ("".PadRight(50,'='));
  Console.WriteLine ();
}
public class MyContext : DbContext
{
  public MyContext(string connectionString)
     : base(connectionString)  {}
  public DbSet<Customer> Customers { get; set; }
  public DbSet<Product> Products { get; set; }
}
public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public virtual List<Customer> Customers { get; set; }
}
public class Customer
{
    public int CustomerId{ get; set; }
    public string CustomerName{ get; set; }
    public virtual List<Product> Products { get; set; }
}

您的项目是使用代码优先迁移还是数据库优先迁移?表可能是在没有迁移的情况下创建的,这意味着实体框架将无法使用此表。