linq 2 sql オブジェクトを手動で実行しようとしているので、次のコードがあります。
var mapping = XmlMappingSource.FromXml(xml);
using (DataContext ctx = new DataContext(conn_string, mapping))
{
list = ctx.GetTable<Achievement>().ToList();
}
XML は次のようになります。
<?xml version="1.0" encoding="utf-8" ?>
<Database Name="FatFights" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007">
<Table Name="dbo.Achievements">
<Type Name="FatFights.Business.Objects.Achievement">
<Column Name="Id" Member="Id" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" />
<Column Name="UserId" Member="UserId" />
<Column Name="Achieved" Member="Achieved" />
<Column Name="AchievementId" Member="AchievementTypeId" />
<Association Name="AchievementType_Achievement" Member="AchievementTypeId" ThisKey="Id" OtherKey="Id" IsForeignKey="true" />
</Type>
</Table>
</Database>
これにより、次のエラーが返されます。
System.InvalidOperationException: タイプ 'Int32' のキー 'Id' のキー メンバー 'Id' が見つかりませんでした。キーが間違っているか、「Int32」のフィールドまたはプロパティの名前が変更されている可能性があります..
したがって、Linq 2 SQL に Id が Int32 ではなく GUID であることを伝える方法を理解する必要があります...そこで、Linq2SQL XML を生成して、その方法を確認し、Type を渡しますが、Type は有効な属性ではありませんXSD であるため、失敗します。
SQL テーブルは次のとおりです。
CREATE TABLE Achievements
(
Id UNIQUEIDENTIFIER NOT NULL CONSTRAINT RG_Achievements ROWGUIDCOL
CONSTRAINT DF_Achievements_Id DEFAULT (NEWID()),
UserId UNIQUEIDENTIFIER NOT NULL,
AchievementId INTEGER NOT NULL,
Achieved DATETIME NOT NULL,
CONSTRAINT FK_Achievements_Users
FOREIGN KEY (UserId)
REFERENCES aspnet_Users (UserId),
CONSTRAINT FK_Achievements_AcheivementTypes
FOREIGN KEY (AchievementId)
REFERENCES AchievementTypes (Id),
CONSTRAINT PK_Achievements
PRIMARY KEY (Id),
CONSTRAINT UQ_Achievements_1
UNIQUE (UserId, AchievementId)
)
およびビジネス オブジェクト:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FatFights.Business.Objects
{
public class Achievement
{
public Guid Id { get; set; }
public Guid UserId { get; set; }
public int AchievementTypeId { get; set; }
public DateTime Achieved { get; set; }
}
}