簡體   English   中英

EF將列添加到橋表並訪問數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM