1

这是我关于stackoverflow的第一个问题,我希望我做对了;)搜索没有为我当前的问题提供任何提示。我是 ASP.NET MVC 4 的新手。

我已经使用 Razor-HTML-Engine 建立了一个新的 ASP.NET MVC 4 项目。我创建了两个模型:

模型客户端

[Table("Clients")]
public class Client
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string ContactName { get; set; }

    public ICollection<License> Licenses { get; set; }
}

模型许可证

[Table("Licenses")]
public class License
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string SerialNumber { get; set; }

    public ICollection<ActivationHistory> ActivationHistory { get; set; }
}

我读到我必须创建一个从 DbContext 派生的新类才能使其正常工作:

public class ClientDbContext : DbContext
{
    public DbSet<Client> Clients { get; set; }
    public DbSet<License> Licenses { get; set; }
}

在我看来,这给了我:

  • 两个具有 PrimaryKeys 的表以及表之间的关联 (1:N)
  • 能够在使用 db.SaveChanges() 后创建客户端对象并用于Client.Licenses.Add()向表中添加新元素
  • 拥有所有许可证的客户使用var t = db.Clients.Single(a => a.Id == 1);

  • 到目前为止我是对的吗?

我现在向客户端添加了示例数据:

// Get Context
var c = new ClientDbContext();

// Create new License
var n1 = new License();
// Testdata
n1.SerialNumber = "12345";

// Get test Client
var test = c.Clients.Single(v => v.ContactName.Contains("Testclient"));

// Add test License to Client
test.Licenses.Add(n1);

// Save Changes
c.SaveChanges()

检查数据库,在许可证表中添加了一个新行。有一个外键 Client_Id 指向正确的客户端Testclient

但是,如果我尝试在视图上显示来自许可证的信息,则根本没有条目:

                 foreach (var item in Model.Licenses)
                 {
                     @Html.DisplayFor(modelItem => item.SerialNumber)
                 }

我正在使用默认的控制器方法:

    public ActionResult Details(int id = 0)
    {
        Client client = db.Clients.Find(id);
        if (client == null)
        {
            return HttpNotFound();
        }

        return View(client);
    }

谁能给我一个提示我做错了什么?

非常感谢!

4

1 回答 1

1

You have to mark your navigation properties(Licenses) as virtual.

于 2013-01-29T10:34:25.963 回答