簡體   English   中英

如何在Entity Framework中映射1:1(可選)映射

[英]How to map a 1:1 (optional) mapping in Entity Framework

我有一個像這樣的課程:

public class Employee
{
    [Column("employee_id")]
    public int EmployeId {get;set;}
}


public class Location
{
    [Column("employee_location_id")]
    public int Id {get;set;}

    [Column("employee_id")]
    public int EmployeeId {get;set;}
}

在Employee類上,我添加了一個虛擬屬性:

public virtual Location Location {get;set;}

我試圖添加一個可選屬性(延遲加載),因此某個員工可能具有或或1個位置。

我現在在加載mvc應用程序時遇到錯誤:

System.Data.SqlClient.SqlException: Invalid column name 'Location_Id'.

您是否嘗試過明確指定FK / Navigation屬性?

public int LocationId { get; set; }
[ForeignKey("LocationId")]
public virtual Location Location { get; set; }

僅填充相關對象的ID時,導航屬性未加載

很難知道您是先執行代碼還是先執行數據庫/模型。 我將給出一個工作代碼優先的答案(第一!)。 對於一對多和多對多關系,您可以使用批注,屬性等來實現。但是對於1-1,我認為您也需要流利的api。

“如何在EF 4.1代碼中首先用延遲加載和兩個表上的相同主鍵來編碼可選的一對一關系?”中也回答了這一問題。 我認為,所需的流暢的API比該答案要短。

例如

public class ExampleContext : DbContext
{
    public ExampleContext()
        : base("Name=ExampleContext") {
        Configuration.LazyLoadingEnabled = true;
        Configuration.ProxyCreationEnabled = true;
    }

    public DbSet<Employee> Employees { get; set; }
    public DbSet<Location> Locations { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Employee>()
                .HasOptional(m => m.Location)
                .WithRequired();
    }
}

public class Employee
{
    [Key]
    [Column("employee_id")]
    public int EmployeeId { get; set; }

    public virtual Location Location { get; set; }
}

public class Location
{
    [Key]
    [Column("employee_id")]
    public int EmployeeId { get; set; }
}

編輯請注意,在此示例中,[Key]屬性不是創建遷移工作所必需的,它們很好地傳達了意圖。 這是一個很好的參考,更詳細地討論了共享主鍵關聯

//  Migration class as follows was generated by code-first migrations (add-migration OneToOne) and then updated the database by update-database
public partial class OneToOne : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.Employees",
            c => new
                {
                    employee_id = c.Int(nullable: false, identity: true),
                })
            .PrimaryKey(t => t.employee_id);

        CreateTable(
            "dbo.Locations",
            c => new
                {
                    employee_id = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.employee_id)
            .ForeignKey("dbo.Employees", t => t.employee_id)
            .Index(t => t.employee_id);

    }

    public override void Down()
    {
        DropIndex("dbo.Locations", new[] { "employee_id" });
        DropForeignKey("dbo.Locations", "employee_id", "dbo.Employees");
        DropTable("dbo.Locations");
        DropTable("dbo.Employees");
    }
}

使用示例:

using (ExampleContext db = new ExampleContext())
{
    var newEmployee = db.Employees.Add(new Employee() { /* insert properties here */ });
    db.SaveChanges();

    db.Locations.Add(new Location() { EmployeeId = newEmployee.EmployeeId /* insert properties here */ });
    db.SaveChanges();

    var employee1 = db.Employees.First();
    var employee1Location = employee1.Location;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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