[英]EF adding columns to bridge table and accessing data
我在兩個表之間有多對多關系。 EF created(首先創建模型)為我創建了具有兩個列的橋表,該列將兩個鍵鏈接在一起。 一切都很好。 但是我想在橋表中添加一些列,以保存與特定關系相關的其他數據。
如果我在alter table add <column name>
上的橋表上alter table add <column name>
,那么如何使用EF訪問數據? 可能嗎? 我想我總是可以做一個直接的SQL查詢..但是那是90年代。
手動設置橋表:
public class User
{
// User stuff
// Bridge table
public virtual ICollection<UserFile> Files { get; set; }
}
public class File
{
// Other File stuff ....
// Bridge table
public virtual ICollection<UserFile> Users { get; set; }
}
// Bridge table
public class UserFile
{
public User User { get; set; }
public File File { get; set; }
public DateTime CreatedDate { get; set; }
// Other metadata here.
}
您可能需要在上下文中設置關系覆蓋OnModelCreating()
modelBuilder.Entity<UserFile>()
.HasRequired(i => i.User)
.WithMany(i => i.Files)
.WillCascadeOnDelete(true);
默認的brdige表名稱是
dbo.Table1NameTable2Name,但您可以自定義它。
您還可以使用automapper
器創建通用靈魂。
例:
public class Account
{
public int AccountId { get; set; }
public virtual List<Operation> Operations { get; set; }
}
public class Operation
{
public Int32 OperationId { get; set; }
public virtual List<Account> Accounts { get; set; }
}
public class MyDbContext : DbContext
{
public DbSet<Operation> Operations { get; set; }
public DbSet<Account> Accounts { get; set; }
public MyDbContext()
: base("name=cs")
{
}
}
public class OperationAccounts
{
public int AccountId { get; set; }
public int OperationId { get; set; }
public string ExtraInfo { get; set; }
}
public static ICollection<OperationAccounts> GetOperationAccounts(string connectionString = @"Data Source=.\;Initial Catalog=TestDb;Integrated Security=true")
{
ICollection<OperationAccounts> dict = new List<OperationAccounts>();
var sqlBuilder = new SqlConnectionStringBuilder(connectionString);
using (var con = new SqlConnection(connectionString))
{
con.Open();
var cmd = con.CreateCommand();
cmd.CommandText = "SELECT * FROM OperationAccounts";
using (var rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.CloseConnection))
{
while (rdr.Read())
{
var accountId = rdr.GetInt32(0);
var opertationId = rdr.GetInt32(1);
var extraColumn = rdr.IsDBNull(2)? string.Empty : rdr.GetString(2);
dict.Add(new OperationAccounts() { AccountId = accountId, OperationId = opertationId, ExtraInfo = extraColumn });
}
}
}
return dict;
}
public static void SetOperationAccounts(ICollection<OperationAccounts> operationAccounts, string connectionString = "name=cs")
{
// Your homework same as GetOperationAccounts
}
static void Main(string[] args)
{
Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>());
using (var dbContext = new MyDbContext())
{
dbContext.Database.ExecuteSqlCommand(@"ALTER TABLE OperationAccounts ADD ExtraInfo VARCHAR(20) NULL; ");
var account = new Account();
var operation = new Operation();
account.Operations = new List<Operation> { operation };
operation.Accounts = new List<Account> { account };
dbContext.Accounts.Add(account);
dbContext.SaveChanges();
var oas = GetOperationAccounts();
foreach (var oa in oas)
{
oa.ToString();
}
}
}
您可以使用默認的橋接表,但是有一種更簡單的方法。 這是帶有額外字段的橋表示例。 在此示例中,我們有兩個實體表和一個橋表
public class Student
{
public int id { get; set; }
public string FullName { get; set; }
public IList<CourseStudent> CourseStudents { get; set; }
}
public class Course
{
public int id { get; set; }
public string CourseName { get; set; }
public IList<CourseStudent> CourseStudents { get; set; }
}
//bridge Table
public class CourseStudent
{
public Student Student { get; set; }
[Key, Column(Order = 0)]
public int Studentid { get; set; }
public Course Course { get; set; }
[Key, Column(Order = 1)]
public int Courseid { get; set; }
//You can add foreign keys like this
//public Yourclass Yourclass{ get; set; }
//[key, Column(Order = )]
//public Yourclasstype(int,string or etc.) Yourclassid{ get; set; }
//Other data fields
public DateTime RegisterDate { get; set; }
}
現在,將此添加到您的DBcontext
public class Yourdbcontextname: DbContext
{
public BridgeDB() : base("name=EFbridge")
{
}
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
public DbSet<CourseStudent> CourseStudents { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.